web-dev-qa-db-ja.com

古いプロセスを見つけ(そして殺し)

基本的には、プロセスツリーをスキャンして、特定の名前に一致し、1週間以上実行し始めたプロセスを見つける必要があります。入手したら、殺す必要があります。すべてのプロセスは、システムによって実行状態にあると見なされますが、システム時間は使用されません。彼らは通常、この状態でも永遠に座ります。

理想的には、プロセスに類似したものを見つけたいと思います。

システムはDebian linuxであり、これはスクリプト化されてcronによって実行されるため、大きなものでも理解できるものでも問題はありません。

10
Ryaner

あなたはこれをps、awk、killの組み合わせで行うことができます:

ps -eo pid,etime,comm

引数なしで、プロセスのPID、プロセスが開始してからの経過時間、およびコマンド名を含む3列の出力を提供します。経過時間は次のいずれかのようになります。

mm:ss
hh:mm:ss
d-hh:mm:ss

1週間以上実行されているプロセスが必要なので、その3番目のパターンに一致する行を探します。次のように、awkを使用して、実行時間とコマンド名でプロセスを除外できます。

ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }'

7日以上実行されている 'mycommand'に一致するすべてのコマンドのPIDを出力します。そのリストをkillにパイプすると、完了です。

ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }' | kill -9
9
Ian Clelland

killall --quiet --older-than 1w process_name

4
billyw

必要な情報はすべてps -efから取得できます。 「STIME」列を参照してください。それをgrepと組み合わせて、必要なプロセスを整理します。その時点で、cutを使用して、一致するすべてのプロセスのpidを取得し、それらをkillに渡すことができます。

これを行う方法の詳細が必要な場合はお知らせください。

1
EEAA

rootの場合、ゴミを取り除くために(/ proc/fs proc/stat ...)

find /proc -maxdepth 1 -regex '/proc/[0-9]*' -type d -mtime +2 -exec basename {} \;
1
user56439

誰も言及していません ps-watcher ここに。 $ start_timeを経過した関数2を使用して比較できると思いますが、完全にはわかりません。これが私の最初の考えです。

[myproc]
occurs = every
trigger = elapsed2secs('$start_time') > 7*DAYS
action = <<EOT
  echo "$command has been running more than 7 days" | /bin/mail user\@Host
  kill -TERM $pid
EOT

それがうまくいくかどうかはわかりませんが、それは良い出発点になるはずです。

0
Phil Hollenback

プロセスが起動すると、/ procファイルシステムにディレクトリが作成されます。次のように、findコマンドを使用して、7日より古いディレクトリを取得し、プロセスを強制終了できます。

find /proc -user myuser -maxdepth 1 -type d -mtime +7 -exec basename {} \; | xargs kill -9 
0
dogbane