当我列出进程时,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
有几种方法可以解决这个问题。
使用 pam_limits.so 和 为用户进程设置 CPU 时间限制
/etc/secrity/limits.conf
。这将导致超出其 CPU 时间配额的进程接收 XCPU 信号;如果他们不专门阻止/忽略/处理它,就会导致他们退出。使用自动尼斯守护进程(
and
Debian/Ubuntu 上的软件包)。它将重新启动和/或终止使用过多 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 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
你真的想杀死正在运行的进程吗?