monit:pidfileなしでプロセスをチェック


36

X時間以上実行されている特定の名前を持つすべてのプロセスを強制終了する方法を探しています。この特定の実行可能ファイルの多くのインスタンスを生成しますが、時々悪い状態になって永久に実行され、多くのCPUを占有します。

私はすでにmonitを使用していますが、pidファイルがないプロセスを確認する方法がわかりません。ルールは次のようになります。

kill all processes named xxxx that have a running time greater than 2 minutes

これをmonitでどのように表現しますか?


ここに答えをマークする必要があります
-ewwhite

回答:


80

monitでは、PIDを持たないプロセスに一致する文字列を使用できます。「myprocessname」という名前のプロセスの例を使用して、

check process myprocessname
        matching "myprocessname"
        start program = "/etc/init.d/myproccessname start"
        stop program = "/usr/bin/killall myprocessname"
        if cpu usage > 95% for 10 cycles then restart

たぶん、CPU負荷が10監視サイクル(各30秒)で特定のレベルにあるかどうかを確認してから、再起動または強制終了することもできます。または、プロセスに関連するファイルでmonitのタイムスタンプテストを使用できます。


1
注意:複数のプロセスがあると機能しません
-ruX

1
次の正規表現を使用できます。matchin "otherstuff。* myprocessname"
-user174962

@ruX:複数の関連プロセスが一致するとどうなりますか?彼らはどのように処理できますか?
kontextify

最初の一致が必要です。
ewwhite

5

その機能を備えたすぐに使えるツールはありません。1分以上実行されるphp-cgiスクリプトを強制終了するとします。これを行う:

pgrep php-cgi | xargs ps -o pid,time | perl -ne 'print "$1 " if /^\s*([0-9]+) ([0-9]+:[0-9]+:[0-9]+)/ && $2 gt "00:01:00"' | xargs kill

pgrepプロセスを名前で選択しps -o pid,time、すべてのpidのランタイムを出力します。次に、行を分析し、そこから時間を抽出し、定義された時間と比較した場合はpidを出力します。結果はkillに渡されました。


非常に長い時間実行されているプロセスは奇妙なランタイム(62-13:53:05)を取得するため、正規表現解析の実行時間は([-0-9] +:[0-9] +:[0-9] + )-式の先頭のマイナスを見てください。
アンドレイ

3

私はps-watcherでこの問題を解決し、数年前にlinux.comでそれについて書きました。ps-watcherを使用すると、プロセスを監視し、累積実行時間に基づいてプロセスを強制終了できます。プロセスの名前が「foo」であると仮定した場合の、関連するps-watcher構成は次のとおりです。

[foo]
  occurs = every
  trigger = elapsed2secs('$time') > 1*HOURS && $ppid != 1
  action = <<EOT
  echo "$command accumulated too much CPU time" | /bin/mail user\@host
  kill -TERM $pid
EOT

[foo?]
   occurs = none
   action = /usr/local/etc/foo restart

キーはラインです

trigger = elapsed2secs('$time') > 1*HOURS && $ppid != 1`

「累積プロセス時間が> 1時間で、私が親プロセスではない場合、再起動してください」と表示されます。

だから、答えはmonitを使用しないが、それは機能することを理解しています。 ps-watcherは軽量でセットアップが簡単なので、monitのセットアップに加えて実行しても問題はありません。



0

これをexecステートメントとしてmonitに組み込むことができます。

    if [[ "$(uname)" = "Linux" ]];then killall --older-than 2m someprocessname;fi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.