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ć?
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).
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).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:
Lub bardziej szczegółowe:
Sprawdź, czy to działa:
Uwaga: działa to w systemie Linux 2.6.36 lub nowszym z glibc 2.13 lub nowszym.
źródło