当CPU /内存使用率过高时,Bash脚本会自动终止进程

KK·帕特尔(KK Patel)

我创建了一个脚本,该脚本可以在CPU和/或内存使用率达到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
征服了

猜想您要解决的问题是,您的计算机上正在运行某些进程,该进程有时行为不当,并且永远挂在一个核心上。

您要做的第一件事是尝试修复疯狂的程序。到目前为止,这是最好的解决方案。我将假设这是不可能的,或者您需要快速熟悉一下才能使盒子继续运行直到修复。

至少,您希望将脚本限制为只运行您所关注的一个程序。最好是,权限是这样限制您的脚本的(例如,您的脚本以用户X的身份运行,以X身份运行的唯一其他东西就是程序)。

更好的办法是使用类似的方法ulimit -t来限制程序可以使用的总CPU时间。同样,如果它消耗了所有内存,请检查ulimit -v内核强制执行这些限制。有关详细信息,请参见手册bash页(这是内置的shell)和手册setrlimit(2)页。

如果问题不是正在运行的进程异常,而是正在运行的进程太多,请实施某种形式的锁定,以防止运行X个以上的对象(或者-这应该很熟悉- ulimit -u)。您还可以考虑更改这些进程的调度程序优先级(使用nicerenice),或者甚至更剧烈地使用sched_setscheduler,将策略更改为SCHED_IDLE

如果您需要更多控制权,请查看控制组(cgroups)。根据运行的内核,实际上可以限制整个进程组一起消耗的CPU时间,内存,I / O等。对照组非常灵活。他们可能会做任何您想做的事情,而不会产生任何脆弱的后果。Arch Linux Wiki有一个值得一读的cgroup简介Nil Brown在LWN上的cgroups系列也值得一读

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章