Pracuję na dużych zbiorach danych. Podczas testowania nowego oprogramowania skrypt czasami się do mnie podkrada, szybko chwyta całą dostępną pamięć RAM i sprawia, że mój komputer nie nadaje się do użytku. Chciałbym, aby ustawić limit pamięci RAM dla procesu, aby jeśli przekroczyłby tę ilość, zostanie automatycznie zabity. Rozwiązanie specyficzne dla języka prawdopodobnie nie będzie działać, ponieważ używam różnego rodzaju różnych narzędzi (R, Perl, Python, Bash itp.).
Czy istnieje jakiś monitor procesu, który pozwoli mi ustawić próg ilości pamięci RAM i automatycznie zabić proces, jeśli zużyje więcej?
Odpowiedzi:
Nienawidzę być facetem, który odpowiada na swoje własne pytanie, ale dziś rano znalazłem alternatywną metodę, zapakowaną w miłe, małe narzędzie. Ograniczy czas pracy procesora lub zużycie pamięci:
https://github.com/pshved/timeout
Najpierw daję temu szansę, ale głosuję za Amey Jah za miłą odpowiedź. Sprawdzę, czy to mnie zawiodło.
źródło
Zdecydowanie odradzam to robić . Jak sugeruje @chrisamiller, ustawienie ulimit ograniczy pamięć RAM dostępną w procesie.
Ale jeśli nalegasz, postępuj zgodnie z tą procedurą.
Zapisz następujący skrypt jako
killif.sh
:Teraz spraw, by był wykonywalny.
Teraz uruchom ten skrypt na terminalu. Zamień na
PROCID
rzeczywisty identyfikator procesu iSIZE
rozmiar w MB.Na przykład:
Jeśli
SIZE
wynosi 100, proces zostanie zabity, jeśli jego użycie pamięci RAM wzrośnie powyżej 100 MB.Uwaga: wiesz, co próbujesz zrobić. Proces zabijania nie jest dobrym pomysłem. Jeśli w tym procesie jest komenda zamknięcia lub zatrzymania, edytuj skrypt i zastąp
kill -9
komendę tąshutdown
komendą.źródło
Wypróbuj
prlimit
narzędzie zutil-linux
pakietu. Działa program z limitami zasobów. Używaprlimit
wywołania systemowego do ustawiania limitów, które są następnie wymuszane wyłącznie przez jądro.Możesz skonfigurować 16 limitów, w tym:
źródło
To było zbyt duże, aby zmieściło się w komentarzu. Zmodyfikowałem oryginalny skrypt Ameya, aby zawierał a
pgrep
, więc zamiast ręcznie wpisywać identyfikator procesu, możesz po prostu wykluczyć według nazwy. Na przykład./killIf.sh chrome 4000
zabija każdy proces chrome, który przekracza 4 GB pamięci.Uważaj, aby wybrać wąski ciąg grep i wystarczająco duży limit pamięci, aby niepotrzebnie nie zabijać niezamierzonych procesów.
źródło