目次
サーバのプロセスで、あるどこかの開発者がつくったんだけどそれが終了せずずっと動き続けているという経験は、誰しも遭遇したことがあるのではないでしょうか。 そんなときに使えるスクリプトです。 これを crontab などで定期的に実行させると、突如現れた終わらないプロセスを終了してくれます。 増産された Apache (httpd) の子プロセスを消すスクリプト, プロセスの実行ディレクトリをリストアップするに似たスクリプトです。
コード
AWS EC2 Amazon Linux のサーバ上で動かしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#!/bin/bash for pid in `ps aux | grep crawler | grep -v grep | tr -s ' ' | cut -d ' ' -f2` do line=`ps --pid ${pid} -eo pid,etimes | grep ${pid}` duration=`cut -d' ' -f 2 <<< ${line}` if [ -z $duration ] then continue fi if [ $duration -ge 345600 ] then echo $duration sudo kill $pid fi done |
内容
for
1 |
for pid in `ps aux | grep target_name | grep -v grep | tr -s ' ' | cut -d ' ' -f2` |
これで プロセスID をイテレートします。
target_name
のところにフィルタしたい条件文字列を入れて目的のプロセスを見つけ出します。
set line
1 |
line=`ps --pid ${pid} -eo pid,etimes | grep ${pid}` |
pid と etimes を出力し、 該当の pid についての行を取得します。
set duration
1 |
duration=`cut -d' ' -f 2 <<< ${line}` |
ps
の結果から 実行時間を取得します。
取得できる実行時間の単位は秒です。
-z $duration
1 2 3 4 |
if [ -z $duration ] then continue fi |
プロセスがなくなっている時もあるので、そのときは次のイテレーションに進みます。
$duration -ge 345600
1 2 3 4 5 |
if [ $duration -ge 345600 ] then echo $duration sudo kill $pid fi |
345,600秒(4日間)以上動いている処理だったら終了します。
sudo kill $pid
でプロセスを終了させています。