Uruchomiłem aplikację serwera i chcę ją uruchomić przez długi czas w celu przetestowania. Niestety zapomniałem ustawić wcześniej, ulimit -c unlimited
aby złapać ewentualną awarię i ją sprawdzić. Czy mogę coś zrobić?
Uruchomiłem aplikację serwera i chcę ją uruchomić przez długi czas w celu przetestowania. Niestety zapomniałem ustawić wcześniej, ulimit -c unlimited
aby złapać ewentualną awarię i ją sprawdzić. Czy mogę coś zrobić?
Odpowiedzi:
W najnowszych wersjach systemu Linux (od wersji 2.6.36) można użyć prlimit
polecenia i wywołania systemowego, aby ustawić limity zasobów dla dowolnego procesu (o odpowiednich uprawnieniach):
$ prlimit --core=unlimited: --pid $$
$ prlimit --core --pid $$
RESOURCE DESCRIPTION SOFT HARD UNITS
CORE max core file size unlimited unlimited blocks
Potrzebny jest plik util-linux-2.21 dla komendy prlimit, ale w przeciwnym razie powinieneś być w stanie stworzyć szybki program, aby wywołać wywołanie systemowe prlimit :
int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit);
Jeśli nie masz wystarczająco nowej wersji Linuksa (lub innego systemu operacyjnego), jedyną znaną mi poprawką jest połączenie się z procesem gdb
i wydanie setrlimit
z debuggera:
$ gdb -p $PID
...
(gdb) set $rlim = &{0ll, 0ll}
(gdb) print getrlimit(9, $rlim)
$1 = 0
(gdb) print *$rlim
$2 = {-1, -1}
(gdb) set *$rlim[0] = 1024*1024
(gdb) print setrlimit(9, $rlim)
$3 = 0
To jest dla ustawienia ulimit -m
, RLIMIT_AS = 9
; dokładnie to samo dotyczy ulimit -c
( RLIMIT_CORE
wartość liczbowa 4
w systemie Linux na x86-64). W przypadku „nieograniczonej” RLIM_INFINITY
zwykle używaj -1
. Powinieneś sprawdzić, /usr/include/bits/types.h
jaki jest rozmiar rlim_t
; Zakładam long long
(jest właściwie niepodpisany, ale użycie podpisanego typu sprawia, że „nieograniczony” -1 jest łatwiejszy do odczytania).
Ponieważ Ubuntu 14.04 Trusty nie ma util-linux-2.21 (jest to 2.20), nie ma prlimit
komendy CLI do użycia.
Za pomocą Python3.4 + (który jest dostępny w Ubuntu 14.04 i wszystkich późniejszych wersjach) można ustawić limit zasobów dla uruchomionego procesu. Uruchom jako root:
1-liniowy:
# PID=966
# grep 'open file' /proc/$PID/limits
Max open files 1024 4096 files
# python3 -c "import resource; resource.prlimit($PID, resource.RLIMIT_NOFILE, (2048, 12345))"
# grep 'open file' /proc/$PID/limits
Max open files 2048 12345 files
Lub bardziej szczegółowe:
# python3
Python 3.4.3 (default, Nov 28 2017, 16:41:13)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import resource
>>> import os
>>> resource.prlimit(os.getpid(), resource.RLIMIT_NOFILE)
(1024, 4096)
>>> resource.prlimit(os.getpid(), resource.RLIMIT_NOFILE, (1369, 9999))
(1024, 4096)
>>> resource.prlimit(os.getpid(), resource.RLIMIT_NOFILE)
(1369, 9999)
Sprawdź, czy to działa:
# grep 'open file' /proc/1472/limits
Max open files 1369 9999 files
Uwaga: działa to w systemie Linux 2.6.36 lub nowszym z glibc 2.13 lub nowszym.
gdb
Technika jest naprawdę fajna. Jedno zastrzeżenie, wydaje się, że nie można zwiększyć liczby otwartych plików dla procesu użytkownika innego niż root powyżej jego twardego limitu,setrlimit
wywołanie zwraca -1, a errno wynosi 22 (niepoprawny argument).