Я создал скрипт, который убивает процессы, если загрузка процессора и / или памяти достигает 80%. Он создает список убитых процессов, когда это происходит. Что я могу сделать, чтобы улучшить это?
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 ]
заставляет меня задуматься, сколько процессора потребляет один этот скрипт. Кроме того, 3 вызоваkill -9
в сценарии работают постоянно? Это дает мне озноб ...sleep 1
в петлеОтветы:
Я предполагаю, что проблема, которую вы хотите решить, заключается в том, что у вас на процессоре запущен какой-то процесс, который иногда ведет себя неправильно и постоянно работает с ядром.
Первое, что вы хотите сделать, это попытаться исправить сумасшедшую программу. Это, безусловно, лучшее решение. Я собираюсь предположить, что это невозможно, или вам нужен быстрый Kluge, чтобы ваш ящик работал до тех пор, пока он не будет исправлен.
Вы, как минимум, хотите ограничить свой сценарий только той программой, которая вас интересует. Было бы лучше, если бы разрешения ограничивали ваш скрипт таким образом (например, ваш скрипт запускается как пользователь X, единственная другая вещь, выполняемая как X, это программа).
Еще лучше было бы использовать что-то вроде
ulimit -t
ограничения общего времени процессора, которое может использовать программа. Точно так же, если он потребляет всю память, проверьтеulimit -v
. Ядро применяет эти ограничения; смотритеbash
man-страницу (это встроенная оболочка) иsetrlimit(2)
man-страницу для подробностей.Если проблема не в запущенном процессе, а в слишком большом количестве запущенных процессов, тогда реализуйте некоторую форму блокировки, чтобы предотвратить запуск более чем X (или - это должно быть знакомо
ulimit -u
). Вы также можете рассмотреть возможность изменения приоритета планировщика этих процессов (используяnice
илиrenice
), или, что еще важнее, использоватьsched_setscheduler
для изменения политикиSCHED_IDLE
.Если вам нужно еще больше контроля, взгляните на контрольные группы (cgroups). В зависимости от того, какое ядро вы используете, вы можете на самом деле ограничить количество процессорного времени, памяти, ввода-вывода и т. Д., Которое потребляет целая группа процессов. Контрольные группы довольно гибки; скорее всего, они могут делать все, что вы пытаетесь, без каких-либо хрупких клугов. Arch Linux Wiki имеет введение в cgroups, которое стоит прочитать, как и серия cgroups Нила Брауна на LWN.
источник
Вопросы:
-n
опцию:sort -nrk 2
. В противном случае строка со%CPU
значением 5,0 окажется выше, чем строка со значением 12,0.ps
реализации вы можете использовать--no-headers
опцию, чтобы избавиться отgrep -v
. Это мешает вам отказаться от команд, которые содержатPID
.echo CPU USAGE is at $CPU_LOAD
, чтобы вы имели в видуecho CPU USAGE is at $CPU_USAGE
.exit 0
что вы вставили во время отладки (?).Стиль:
CPU_USAGE_THRESHOLD=800
строку в начало файла, так как это наиболее информативная вещь, которая, скорее всего, изменится даже после того, как ваш скрипт будет стабильным.-e
опцию: такps -eo pid -eo pcpu -eo command
же, какps -eo pid -o pcpu -o command
(как естьps -eo pid,pcpu,command
).else
предложение. Это всегда выглядит так, как будто это должно быть обработано, но не по какой-то неизвестной причине.источник
Убийство процессов, которые используют большую часть ресурсов процессора / памяти, вызывает проблемы: просто посмотрите, какие они сейчас на вашем компьютере (здесь в настоящее время firefox, systemd (init), Xorg, gnome-терминал, набор потоков ядра, xemacs; ни один из которых не является обязательным). Посмотрите, как настроить OOM-убийцу в Linux, например, здесь .
Также обратите внимание, что «память, используемая процессом» является туманным понятием, поскольку существуют общие библиотеки, общие исполняемые файлы и даже части областей данных. Можно придумать какое-то число, взимая с каждого пользователя часть использованного пространства, но даже если добавить, что это действительно не дает «использованной памяти» (еще меньше «освобождается память, если процесс уходит»), разделяемые части остаются позади).
источник
Я создал сценарий kill-process , который убивает некоторые процессы, перечисленные в массиве, если загрузка ЦП превышает XX% в течение YY секунд или убивает процессы, выполняющиеся более ZZ секунд.
ПРИМЕЧАНИЕ. Вот мой репозиторий на Github: https://github.com/padosoft/kill-process
Вот скриншот:
использованная литература
Основная часть скрипта (реферат кода для топ-команды):
Использование:источник
sort
должно бытьsort -k9nr
. Безn
, получим `5.9`>29.4
.