X次后杀死CPU使用率高的进程?[关闭]


21

运行Linux我有一些进程偶尔会崩溃(游戏服务器),最终使用100%cpu。

我正在寻找一个程序或脚本来按名称检查进程列表的cpu使用情况,并且如果它们以100%的速度超过X时间(例如30秒),请杀死它们。我尝试了ps-watcher,但无法确定如何完成此操作。

仅以100%的使用率杀死该进程是行不通的,因为它将在正常运行期间短暂击中该进程。

我还发现了这个脚本,它似乎可以满足我的要求,但是仅限于一个过程:link

任何帮助是极大的赞赏!


您能否再次发布指向脚本的链接,导致此一个pastebin.com/m1c814cb4似乎不再有效。

我猜对了,您正在运行Minecraft服务器吗?;)
PhonicUK 2012年

@Chris S你很沉闷。这是一个非常有趣的问题。您是否可以为索赔提供信息来源,“因为它们吸引了质量低下,自以为是的垃圾邮件,而且答案很快就过时了”。您能举一些例子说明这个问题的现有答案如何实现吗?我没有屏住呼吸。
db

Answers:


19

尝试monit

您可以使用如下配置来完成任务:

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的文档


感谢您的答复!有什么方法可以监视进程而无需先启动monit吗?我在计算机上运行着大量服务器,这些服务器是通过Web界面进行管理的,因此必须使用monit启动它们并不理想。
user30153

当然,start programstop program行仅用于monit需要重新启动过程的情况。您仍然可以使用普通的init脚本启动它。monit也可以检查程序是否已经在运行(例如通过其PID文件或进程名称)。
09年

太棒了,我想我已经明白了。唯一的问题是它依赖于pid文件,我将不得不为200多个进程生成一个文件,并为我想的每个文件创建规则。谢谢您的帮助!
user30153

4

这就是我一直在寻找的东西,并且已经使用了一段时间(稍作改动)。最近,我在工作中放了一个bug,但需要保持应用程序(游戏服务器)运行。
我引用了杀死最高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


这个小脚本非常有用,如果您不喜欢它杀死任何进程,那么仅电子邮件就可以帮助您随时了解情况。


感谢您的回答!我只想指出,您的排序TOPPROCESS已关闭。它不会按实际值排序,而是会按字母数字顺序对条目进行排序(例如6%的优先级高于12%)。更好的替代方法可能是以下命令:top -b -n 1 | sed 1,6d | sed -n 2p
Glutanimate

1
如果CPU为90%,则CPU_LOAD是多少?以及如何计算阈值?谢谢
Ofir Attia 2014年

1
这不会捕获多核服务器上一个进程已用完的情况。
UpTheCreek

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,示例脚本将终止最顶层的进程。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.