运行linux我有几个进程,往往偶尔崩溃(游戏服务器),最终使用100%的CPU。 我正在寻找一个程序或脚本来检查名称的进程列表的CPU使用情况,如果他们是100%超过X时间,比如30秒,杀死他们。 我试过ps-watcher,但无法确定如何完成这一点。 只是在100%的使用率下杀死进程将无法正常工作,因为它会在正常运行期间的短暂时间内发生。 我也发现这个脚本,似乎做我想要的,但它是有限的一个过程: 链接任何帮助,非常感谢!
试试看。
你可以使用这样的configuration来完成你的任务:
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
有关此configuration的详细信息可以在monit的文档中find。
这就是我一直在寻找的东西,并且现在已经使用了一段时间(稍微改变了)。 最近,我在工作中join了一个bug,但是需要保持app(游戏服务器)运行。
我曾经引用过最顶层的PID被杀死的部分,因为它正在杀死错误的PID。
这是我的脚本的最新草稿,到目前为止,它find了最重要的过载,并有效地杀死了它(也发送电子邮件给我的信息,无论什么时候);
#!/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="[email protected]" # 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,那么示例脚本将会终止最上面的进程。