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


10

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

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

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


4
古いが重要なプロセスと、喜んで殺すプロセスをどのように区別しますか?
Chopper3

回答:


9

これを行うには、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

ありがとうございます。psのフォーマットオプションについて完全に忘れていました。
Ryaner、2009年

2
これは、「7日以上」実行しているプロセスを示していません。7日から8日未満のプロセスが表示されます。
hobodave

etimesより便利である- serverfault.com/a/393476/67675
poigeは、

4

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


1
これはUbuntu 16.04で素晴らしい動作をし、-i(インタラクティブ)フラグを使用してテストし、想定どおりのプロセスをターゲットにしていることを確認できます。
ezwrighter

1

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

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


詳細を教えてください。他の答えは単に正しくありません。
hobodave

1

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

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

0

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

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

これも機能しません。find: warning: you have specified the -maxdepth option after a non-option argument -user, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.現状のまま、この警告が生成され、追加の出力はありません。- maxdepthを最初の出力に移動すると、プロセスは返されません。多くのものが一致するはずです。
hobodave

また、dirの作成日を探しているのに、なぜmtimeがctimeではないのですか?追加の子が作成された場合、理論的にはディレクトリを変更できますが、これは除外しません(おそらく、新しくロードされたカーネルモジュールがsysfsを何らかの方法で拡張します)
jmtd

0

ここで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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.