基本的には、プロセスツリーをスキャンして、特定の名前に一致し、1週間以上実行し始めたプロセスを見つける必要があります。入手したら、殺す必要があります。すべてのプロセスは、システムによって実行状態にあると見なされますが、システム時間は使用されません。彼らは通常、この状態でも永遠に座ります。
理想的には、プロセスに類似したものを見つけたいと思います。
システムはDebian linuxであり、これはスクリプト化されてcronによって実行されるため、大きなものでも理解できるものでも問題はありません。
あなたはこれを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
killall --quiet --older-than 1w process_name
必要な情報はすべてps -ef
から取得できます。 「STIME」列を参照してください。それをgrep
と組み合わせて、必要なプロセスを整理します。その時点で、cut
を使用して、一致するすべてのプロセスのpidを取得し、それらをkill
に渡すことができます。
これを行う方法の詳細が必要な場合はお知らせください。
rootの場合、ゴミを取り除くために(/ proc/fs proc/stat ...)
find /proc -maxdepth 1 -regex '/proc/[0-9]*' -type d -mtime +2 -exec basename {} \;
誰も言及していません 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
それがうまくいくかどうかはわかりませんが、それは良い出発点になるはずです。
プロセスが起動すると、/ procファイルシステムにディレクトリが作成されます。次のように、findコマンドを使用して、7日より古いディレクトリを取得し、プロセスを強制終了できます。
find /proc -user myuser -maxdepth 1 -type d -mtime +7 -exec basename {} \; | xargs kill -9