Bash

當 CPU/記憶體使用率過高時自動終止程序的 Bash 腳本

  • June 7, 2016

我創建了一個腳本,如果 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

你想解決的問題是你的盒子上執行了一些程序,有時行為不端,並且永遠固定在一個核心上。

您要做的第一件事是嘗試修復發瘋的程序。這是迄今為止最好的解決方案。我將假設這是不可能的,或者你需要一個快速的 kluge 來保持你的盒子執行直到它固定。

您至少希望將您的腳本限制為只訪問您關心的一個程序。如果權限像這樣限制您的腳本,那將是最好的(例如,您的腳本以使用者 X 身份執行,唯一以 X 身份執行的其他東西就是程序)。

更好的是使用類似ulimit -t限製程序可以使用的總 CPU 時間的東西。同樣,如果它消耗了所有記憶體,請檢查ulimit -v. 核心強制執行這些限制;有關詳細資訊,請參見bash手冊頁(它是內置的 shell)和setrlimit(2)手冊頁。

如果問題不在於程序執行異常,而只是執行的程序過多,則實施某種形式的鎖定以防止超過 X 的執行(或者——這應該很熟悉ulimit -u——)。您還可以考慮更改這些程序的調度程序優先級(使用niceor renice),或者更激烈的,使用sched_setscheduler將策略更改為SCHED_IDLE.

如果您需要更多控制,請查看控制組 (cgroups)。根據您執行的核心,您實際上可以限制整個程序組共同消耗的 CPU 時間、記憶體、I/O 等量。對照組非常靈活;他們可能會做任何你想做的事,沒有任何脆弱的kluges。Arch Linux Wiki 有一個值得一讀的 cgroups 簡介,Neil Brown在 LWN 的 cgroups 系列也是如此。

引用自:https://unix.stackexchange.com/questions/66786