如何终止使用我的用户名在(过去一小时、过去一天)等内启动的所有进程?
答案1
- 找到不到一个小时的进程
- 提取pid
- 杀死pids
进程列表:
$ ps -e -o pid,user,etimes,comm \
| awk -v me=$USER '$2 == me && $3 <= 3600 { print }'
生产
661162 jaroslav 3006 chrome
667859 jaroslav 1711 chrome
669145 jaroslav 1471 chrome
671222 jaroslav 1016 chrome
675278 jaroslav 270 chrome
675578 jaroslav 207 sleep
676094 jaroslav 91 chrome
676102 jaroslav 91 chrome
676528 jaroslav 11 chrome
676529 jaroslav 11 chrome
676553 jaroslav 11 chrome
676602 jaroslav 3 top
676615 jaroslav 0 ps
676616 jaroslav 0 awk
提取pid:
$ ps -e -o pid,user,etimes,comm \
| awk -v me=$USER '$2 == me && $3 <= 3600 { print $1 }'
杀死pid:
$ ps -e -o pid,user,etimes,comm \
| awk -v me=$USER '$2 == me && $3 <= 3600 { print $1 }' \
| xargs -rt kill
xargs 的 -tr 参数是可选的,如果没有输出并报告每个执行的行,则将跳过 xargs。
您甚至可以测试它,kill -0
它不会停止进程,但如果进程不再运行,则会报告错误。
$ ps -e -o pid,user,etimes,comm \
| awk -v me=$USER '$2 == me && $3 <= 3600 { print $1 }' \
| xargs -rt kill -0
kill -0 661162 667859 669145 671222 675278 676602 677310 677311 677883 677893 677965 677966 677967 677968
kill: (677966): No such process
kill: (677967): No such process
意识到这个管道/脚本可以在反馈后自行终止(注意上面进程列表中的 etimes=0),这里是一个忽略最近进程的修订版本:
ps -u "$LOGNAME" -o pid,etimes,comm \
| awk '$2 <= 3600 && $2 > 1 { print $1 }' \
| xargs -rt kill -0
这可能不太便携,但应该可以在 Linux 上运行(至少 ubuntu 18)。希望这能让您了解如何解决这个问题。
<mother-mode>
请在不使用 awk 和 xargs 的情况下运行 ps 命令,然后先杀死以查看将杀死哪些内容,如果以 root 身份运行,请小心。您可能会关闭系统或终止最近重新启动的某些重要服务。
</mother-mode>