我创建了一个脚本,该脚本可以在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
)。您还可以考虑更改这些进程的调度程序优先级(使用nice
或renice
),或者甚至更剧烈地使用sched_setscheduler
,将策略更改为SCHED_IDLE
。
如果您需要更多控制权,请查看控制组(cgroups)。根据运行的内核,实际上可以限制整个进程组一起消耗的CPU时间,内存,I / O等。对照组非常灵活。他们可能会做任何您想做的事情,而不会产生任何脆弱的后果。Arch Linux Wiki有一个值得一读的cgroup简介,Nil Brown在LWN上的cgroups系列也值得一读。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句