如何从ps输出中获取N天前的进程列表

如何从ps输出中获取N天前的进程列表

如何从命令输出中获取日期列表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 兼容系统)。

相关内容