KK *_*tel 12 bash cpu memory shell-script cpu-usage
我创建了一个脚本,如果 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
Run Code Online (Sandbox Code Playgroud)
der*_*ert 11
我猜你想解决的问题是你的机器上运行了一些进程,这些进程有时会出现行为不端,并且永远挂在一个核心上。
您要做的第一件事是尝试修复疯狂的程序。这是迄今为止最好的解决方案。我将假设这是不可能的,或者你需要一个快速的kluge来保持你的盒子运行直到它被修复。
您至少希望将脚本限制为仅运行您关心的一个程序。最好是权限像这样限制您的脚本(例如,您的脚本以用户 X 身份运行,唯一以 X 身份运行的其他东西就是程序)。
更好的是使用类似的东西ulimit -t来限制程序可以使用的总 CPU 时间。同样,如果它消耗了所有内存,请检查ulimit -v。内核强制执行这些限制;有关详细信息,请参阅bash联机帮助页(它是内置的 shell)和setrlimit(2)联机帮助页。
如果问题不是运行异常的进程,而是运行的进程太多,那么实现某种形式的锁定以防止运行多个 X(或者——这应该变得很熟悉—— ulimit -u)。您还可以考虑更改这些进程的调度程序优先级(使用nice或renice),或者更激烈地,使用sched_setscheduler将策略更改为SCHED_IDLE。
如果您需要更多控制,请查看控制组 (cgroups)。根据您运行的内核,您实际上可以限制整个进程组共同消耗的 CPU 时间、内存、I/O 等。对照组相当灵活;他们可能会做你想做的任何事情,没有任何脆弱的kluges。Arch Linux Wiki 有一个值得一读的cgroups 介绍,还有Neil Brown在 LWN的 cgroups 系列。
| 归档时间: |
|
| 查看次数: |
39520 次 |
| 最近记录: |