BSD: PIDを用いた自己監視スクリプト

業務上でスクリプトが想定を上回る実行時間となった場合にメッセージを出力する仕組を考える必要がありました。基本的には次の流れで監視を行います。

  • 親プロセスから監視用の子プロセスを生成する
  • 子プロセスはバックグラウンドで動作させる
  • 親プロセスのPIDをファイルで保存する
  • 子プロセスはPIDファイルの内容が存在するかを確認する

今回の監視パターンは常駐型ではなくて時限式です。ある一定の時間が経過した際に親プロセスが存在するかどうかを確認するような形式になります。

今回使用したスクリプトを2本掲載します。あくまでも実験用ですので本番稼動中のシステムでそのまま利用するような事はしないように!安全性を考えると実際には稼動しているプロセスの詳細情報も組み入れる必要があります。

$ cat getpid.ksh
#!/bin/ksh
pidfile=getpid`date +%Y%m%d%H%M%S`.pid
logfile=killpid.log
export pidfile logfile
 
echo $$ > $pidfile
date >> $logfile
ksh -x killpid.ksh >> $logfile &
 
sleep 10
 
exit
$ cat killpid.ksh
#!/bin/ksh
 
sleep 5
 
echo $pidfile
ps `cat $pidfile`
if [ $? -eq 0 ]; then
echo PID `cat $pidfile` exist.
else
echo PID `cat $pidfile` not exist.
fi
rm -f $pidfile
exit

getpid.ksh が親プロセスで killpid.ksh が子プロセスになります。双方に入っている sleep は大小を逆転する事でプロセスが “存在する場合” “存在しない場合” を確認する為のものです。正直なところ見所は変数 $$ を用いたPIDの取得だけですが、興味のある方は一度試してみてください。思わぬ所で役に立つかも。