ps出力からN日前のプロセスリストを取得する方法

ps出力からN日前のプロセスリストを取得する方法

ps30日より古いプロセスのみを表示するためにコマンド出力から日付リストを取得するにはどうすればよいですか?

私の目標は、これらのプロセスを終了することです。コマンドで簡単にこれを行うことができますkillall

例えばkillall -u user --older-than 1M

しかし、動作しない古いバージョンのコマンドがあったので、--older-than別の方法を見つける必要がありました。

私が検討していることの1つは、プロセスのリストを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

etimes比較的最新バージョンのprocpsでは、秒を経過時間として使用できます。

ps -Ao etimes= -o pid= |
  awk -v n=30 '$1 >= n*86400 {print $2}' |
  xargs -r kill

(これはGNUをオプションxargsと仮定します-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互換システムで動作する必要があります。)

関連情報