Bash
當 CPU/記憶體使用率過高時自動終止程序的 Bash 腳本
我創建了一個腳本,如果 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
——)。您還可以考慮更改這些程序的調度程序優先級(使用nice
orrenice
),或者更激烈的,使用sched_setscheduler
將策略更改為SCHED_IDLE
.如果您需要更多控制,請查看控制組 (cgroups)。根據您執行的核心,您實際上可以限制整個程序組共同消耗的 CPU 時間、記憶體、I/O 等量。對照組非常靈活;他們可能會做任何你想做的事,沒有任何脆弱的kluges。Arch Linux Wiki 有一個值得一讀的 cgroups 簡介,Neil Brown在 LWN 的 cgroups 系列也是如此。