Запуск Linux У меня есть несколько процессов, которые иногда дают сбой (игровые серверы), которые в конечном итоге используют 100% ЦП.
Я ищу программу или сценарий для проверки использования ЦП списка процессов по имени, и если они работают на 100% дольше X времени, скажем 30 секунд, убить их. Я попробовал ps-watcher, но не смог определить, как это сделать.
Простое завершение процесса при 100% использовании не сработает, так как это произойдет в течение коротких периодов при нормальной работе.
Я также нашел этот сценарий, который, кажется, делает то, что я хочу, однако он ограничен одним процессом: ссылка на сайт
Любая помощь приветствуется!
Пытаться контролировать.
Вы можете использовать такую конфигурацию для выполнения своей задачи:
check process gameserver with pidfile /var/run/gameserver.pid
start program = "/etc/init.d/gameserver start" with timeout 60 seconds
stop program = "/etc/init.d/gameserver stop"
if cpu > 80% for 2 cycles then alert
if cpu > 95% for 5 cycles then restart
if totalmem > 200.0 MB for 5 cycles then restart
if loadavg(5min) greater than 10 for 8 cycles then stop
if failed port 12345 type tcp with timeout 15 seconds
then restart
if 3 restarts within 5 cycles then timeout
Подробности об этой конфигурации можно найти в monit's документация.
Это было то, что я искал и использую уже некоторое время (с небольшими изменениями). В последнее время я исправил ошибку в своей работе, но мне нужно, чтобы приложение (игровой сервер) работало.
Я процитировал часть, где убивается самый верхний PID, поскольку он убивал неправильный PID.
Вот мой последний черновик вашего скрипта, на данный момент он находит самую большую перегрузку и эффективно ее устраняет (также отправляет мне по электронной почте информацию, когда что-то делает);
#!/bin/bash
## Note: will kill the top-most process if the $CPU_LOAD is greater than the $CPU_THRESHOLD.
echo
echo checking for run-away process ...
CPU_LOAD=$(uptime | cut -d"," -f4 | cut -d":" -f2 | cut -d" " -f2 | sed -e "s/\.//g")
CPU_THRESHOLD=300
PROCESS=$(ps aux r)
TOPPROCESS=$(ps -eo pid -eo pcpu -eo command | sort -k 2 -r | grep -v PID | head -n 1)
if [ $CPU_LOAD -gt $CPU_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 load average is at $CPU_LOAD
echo
echo Active processes...
ps aux r
# send an email using mail
SUBJECT="Runaway Process Report at Marysol"
# Email To ?
EMAIL="myemail@somewhere.org"
# Email text/message
EMAILMESSAGE="/tmp/emailmessage.txt"
echo "System overloading, possible runaway process."> $EMAILMESSAGE
echo "Top-most process killed $TOPPROCESS" >>$EMAILMESSAGE
echo "Load average was at $CPU_LOAD" >>$EMAILMESSAGE
echo "Active processes..." >>$EMAILMESSAGE
echo "$PROCESS" >>$EMAILMESSAGE
mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE
else
echo
echo no run-aways.
echo load average is at $CPU_LOAD
echo
echo Active processes...
ps aux r
fi
exit 0
Этот небольшой скрипт был чрезвычайно полезен, если вам не нравится, что он убивает какой-либо процесс, одно только электронное письмо поможет держать вас в курсе.
Ниже приведен пример сценария BASH, который может помочь вам получить некоторые подсказки для ваших нужд.
#!/bin/bash
CPU_LOAD=$(uptime | cut -d"," -f4 | cut -d":" -f2 | cut -d" " -f2 | sed -e "s/\.//g")
CPU_THRESHOLD=700
if [ $CPU_LOAD -gt $CPU_THRESHOLD ] ; then
kill -9 $(ps -eo pid | sort -k 1 -r | grep -v PID | head -n 1)
fi
exit 0
Обратите внимание, что значение вашего $ CPU_THRESHOLD должно зависеть от количества ядер (CPU) в вашей системе. Подробное объяснение по этой теме можно найти на http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages .
Вы можете вызвать свой скрипт из / etc / inittab или cronjob на любое количество минут, которое вы предпочитаете. Также обратите внимание, что пример сценария уничтожит самый верхний процесс, если $ CPU_LOAD больше, чем $ CPU_THRESHOLD.