Linux
如何殺死給定使用者的所有程序,這些程序需要比 X 時間更長的時間
當我列出程序時,
ps auxf
我經常看到一些卡住了,我需要手動殺死它們。我怎樣才能用一個命令來做到這一點?範例 ps 結果:
$ ps auxf USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND tommass 7971 62.3 1.1 316428 45844 ? R Aug08 29133:14 xxxxxxxx tommass 7978 0.0 2.6 455072 105964 ? S Aug08 8:56 xxxxxxxx tommass 7979 0.0 2.6 454436 105360 ? S Aug08 8:57 xxxxxxxx tommass 15034 67.8 1.1 51828 43760 ? R Aug14 26411:38 xxxxxxxx tommass 7982 0.0 2.6 455012 105904 ? S Aug08 8:28 xxxxxxxx
- 如何殺死給定使用者“tommass”的所有程序,這些程序需要超過 1 小時
- 如何殺死 STAT 為“R”的給定使用者“tommass”的所有程序
回答 1),從
ps -u tomass -o pid,time
(根據您的上下文,您可能希望選擇時間(cpu 時間)、etime(經過時間))
要回答 2),請嘗試
ps -u tomass -o state,pid | awk '$1 == "R" { printf "kill %d\n",$2 ;}' | ksh
你真的想殺死正在執行的程序嗎?
有幾種方法可以解決這個問題。
- 使用 pam_limits.so 和 . 設置使用者程序的 CPU 時間限制
/etc/secrity/limits.conf
。這將導致超出其 CPU 時間配額的程序收到 XCPU 信號;如果他們沒有專門阻止/忽略/處理它,它將導致他們退出。- 使用Auto Nice 守護程序(
and
Debian/Ubuntu 上的軟體包)。它會 renice 和/或殺死使用過多 CPU 時間的程序。- 應該可以破解一個
ps(1)
使用格式字元串參數呼叫的腳本,使其僅列印您關心的欄位(即 cpu 時間、使用者名、pid),然後使用 shellscript 之類的處理該輸出grep -f file-with-one-username-per-line | while read cputime username pid; do [ "$cputime" -gt max-cpu-time ] && kill -9 $pid; done
,但這將是重新發明 Auto Nice 守護程序。