Linux

如何殺死給定使用者的所有程序,這些程序需要比 X 時間更長的時間

  • September 10, 2014

當我列出程序時,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
  1. 如何殺死給定使用者“tommass”的所有程序,這些程序需要超過 1 小時
  2. 如何殺死 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

你真的想殺死正在執行的程序嗎?

有幾種方法可以解決這個問題。

  1. 使用 pam_limits.so 和 . 設置使用者程序的 CPU 時間限制/etc/secrity/limits.conf。這將導致超出其 CPU 時間配額的程序收到 XCPU 信號;如果他們沒有專門阻止/忽略/處理它,它將導致他們退出。
  2. 使用Auto Nice 守護程序andDebian/Ubuntu 上的軟體包)。它會 renice 和/或殺死使用過多 CPU 時間的程序。
  3. 應該可以破解一個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 守護程序。

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