如何终止给定用户花费超过 X 时间的所有进程

如何终止给定用户花费超过 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
  1. 如何终止给定用户“tommass”花费超过 1 小时的所有进程
  2. 如何终止 STAT 为“R”的给定用户“tommass”的所有进程

答案1

有几种方法可以解决这个问题。

  1. 使用 pam_limits.so 和 为用户进程设置 CPU 时间限制/etc/secrity/limits.conf。这将导致超出其 CPU 时间配额的进程接收 XCPU 信号;如果他们不专门阻止/忽略/处理它,就会导致他们退出。

  2. 使用自动尼斯守护进程andDebian/Ubuntu 上的软件包)。它将重新启动和/或终止使用过多 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 Daemon。

答案2

要回答 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

你真的想杀死正在运行的进程吗?

相关内容