Stworzyłem skrypt, który zabija procesy, jeśli użycie procesora i / lub pamięci osiągnie 80%. Gdy tak się dzieje, tworzona jest lista zabitych procesów. Co mogę zrobić, aby to poprawić?
while [ 1 ];
do
echo
echo checking for run-away process ...
CPU_USAGE=$(uptime | cut -d"," -f4 | cut -d":" -f2 | cut -d" " -f2 | sed -e "s/\.//g")
CPU_USAGE_THRESHOLD=800
PROCESS=$(ps aux r)
TOPPROCESS=$(ps -eo pid -eo pcpu -eo command | sort -k 2 -r | grep -v PID | head -n 1)
if [ $CPU_USAGE -gt $CPU_USAGE_THRESHOLD] ; then
kill -9 $(ps -eo pid | sort -k 1 -r | grep -v PID | head -n 1) #original
kill -9 $(ps -eo pcpu | sort -k 1 -r | grep -v %CPU | head -n 1)
kill -9 $TOPPROCESS
echo system overloading!
echo Top-most process killed $TOPPROCESS
echo CPU USAGE is at $CPU_LOAD
else
fi
exit 0
sleep 1;
done
while [ 1 ]
zastanawiam się, ile procesora sam ten skrypt zużyje. Ponadto 3 połączeniakill -9
w skrypcie działającym stale? To daje mi dreszcze ...sleep 1
pętlęOdpowiedzi:
Jestem zgadywania problem chcesz rozwiązać to, że masz jakiś proces uruchomiony na polu, które czasami niegrzeczne i siedzi na zawsze pegging rdzeń.
Pierwszą rzeczą, którą chcesz zrobić, to spróbować naprawić zwariowany program. To zdecydowanie najlepsze rozwiązanie. Zakładam, że nie jest to możliwe, albo potrzebujesz szybkiego kluge, aby utrzymać swoje pudełko do czasu jego naprawy.
Przynajmniej chcesz ograniczyć swój skrypt, aby uderzył tylko w jeden program, którego dotyczysz. Byłoby najlepiej, gdyby uprawnienia ograniczały twój skrypt w ten sposób (np. Twój skrypt działa jako użytkownik X, jedyną inną rzeczą działającą jako X jest program).
Jeszcze lepiej byłoby użyć czegoś takiego jak
ulimit -t
ograniczenie całkowitego czasu procesora, który program może wykorzystać. Podobnie, jeśli zużywa całą pamięć, sprawdźulimit -v
. Jądro wymusza te ograniczenia; zobacz stronębash
podręcznika (jest to wbudowana powłoka) i stronę,setrlimit(2)
aby uzyskać szczegółowe informacje.Jeśli problemem nie jest uruchomiony proces amokowy, ale zamiast tego działa po prostu zbyt wiele procesów, to zaimplementuj jakąś formę blokowania, aby zapobiec uruchomieniu więcej niż X (lub - to powinno się zaznajomić -
ulimit -u
). Możesz także rozważyć zmianę priorytetu harmonogramu tych procesów (za pomocąnice
lubrenice
), lub jeszcze bardziej drastycznego, za pomocąsched_setscheduler
zmiany polityki naSCHED_IDLE
.Jeśli potrzebujesz jeszcze większej kontroli, spójrz na grupy kontrolne (cgroups). W zależności od uruchomionego jądra możesz faktycznie ograniczyć czas procesora, pamięć, operacje we / wy itp., Które pochłania cała grupa procesów. Grupy kontrolne są dość elastyczne; prawdopodobnie zrobią wszystko, co chcesz, bez żadnych kruchych ćwiartek. Arch Arch Wiki ma wprowadzenie do grup, które warto przeczytać, podobnie jak seria cgroups Neila Browna w LWN.
źródło
Zagadnienia:
-n
opcji:sort -nrk 2
. W przeciwnym razie linia o%CPU
wartości 5,0 skończy się wyżej niż jedna o wartości 12,0.ps
implementacji możesz chcieć skorzystać z--no-headers
opcji, aby się go pozbyćgrep -v
. Zapobiega to odrzucaniu poleceń zawierającychPID
.echo CPU USAGE is at $CPU_LOAD
miałeś na myśliecho CPU USAGE is at $CPU_USAGE
.exit 0
, co wstawiłeś podczas debugowania (?).Styl:
CPU_USAGE_THRESHOLD=800
linię na początek pliku, ponieważ jest to najbardziej pouczająca rzecz i najprawdopodobniej ulegnie zmianie nawet po stabilnym skrypcie.-e
opcję:ps -eo pid -eo pcpu -eo command
jest taka sama jakps -eo pid -o pcpu -o command
(jak jestps -eo pid,pcpu,command
).else
klauzula. To zawsze wygląda na to, że należy sobie z tym poradzić, ale nie z jakiegoś nieznanego powodu.źródło
Zabicie procesów, które wykorzystują najwięcej procesora / pamięci, wymaga problemów: wystarczy spojrzeć na to, jakie są teraz na twoim komputerze (tutaj obecnie firefox, systemd (init), Xorg, gnome-terminal, zestaw wątków jądra, xemacs; z których żaden nie jest zbędny). Zobacz, jak na przykład ulepszyć OOM-zabójcę Linuksa, na przykład tutaj .
Zauważ też, że „pamięć używana przez proces” jest mglistym pojęciem, ponieważ istnieją wspólne biblioteki, pliki wykonywalne są wspólne, a nawet części obszarów danych. Można wymyślić pewną liczbę, obciążając każdego użytkownika ułamkiem zużytej przestrzeni, ale nawet dodanie tego w rzeczywistości nie daje „zużytej pamięci” (nawet mniej „zwolnionej pamięci, jeśli proces zniknie”, dzielone części pozostają za).
źródło
Stworzyłem skrypt, kill-process , który zabija niektóre procesy wymienione w tablicy, jeśli użycie procesora jest większe niż XX% przez YY sekund lub zabija procesy, które działają dłużej niż ZZ sekundy.
UWAGA: Oto moje repozytorium na Github: https://github.com/padosoft/kill-process
Oto zrzut ekranu:
Bibliografia
Zasadnicza część skryptu (streszczenie kodu dla najwyższej komendy):
Stosowanie:źródło
sort
powinno byćsort -k9nr
. Bezn
otrzyma „5.9”>29.4
.