如何从命令输出中获取日期列表ps
以仅显示超过 30 天的进程?
我的目标是杀死这些进程。我可以通过命令轻松地做到这一点killall
。
例如killall -u user --older-than 1M
但我们有该命令的过时版本,--older-than
无法使用,因此我不得不寻找另一种方法。
我正在考虑的一件事是将进程列表传递给kill命令,但我不知道如何只获取30天及以上的进程。
如果有这样的事情:
ps --no-header -u username --sort=start_time -o user,pid,lstart | #get all processes beyond 30 days old | while read -r pid; do kill $pid; done
编辑:我们正在使用 procps 版本 3.2.8
答案1
对于相对较新版本的 procps,您可以使用etimes
秒数作为经过时间:
ps -Ao etimes= -o pid= |
awk -v n=30 '$1 >= n*86400 {print $2}' |
xargs -r kill
(这里假设 GNUxargs
作为其-r
选项)
或者:
ps -Ao etimes= -o pid= |
awk -v n=30 '$1 >= n*86400 {print "kill", $2}' |
sh
对于旧版本,您可以恢复到etime
:
LC_ALL=C ps -Ao etime= -o pid= |
awk -v n=30 '$1 ~ /^[[:digit:]]+-/ && 0+$1 >= n {print "kill", $2}' |
sh
(该语法是 POSIX,并且应该适用于所有 POSIX 兼容系统)。