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