メモ:pidによる簡易的なシェルスクリプト実行制御

#!/bin/sh
:
: このスクリプトのpidファイルの場所を定義する。
:  basenameコマンドにより絶対パス記述時ディレクトリ部分を除去。相対パス記述時は影響なし。
:  同様のことは${0##*/}でも可能
pidfile="/var/run/`basename${0%.*}`.pid"
:
: pidファイルは下記のようなプロセスIDの文字列長最大5文字の改行コードを含まないテキストファイルとする。
: # cat ${pidfile}
:   process-id[EOF]
:
: process-idは1-65535までのプロセスIDを示す。
:

: pidファイルがあるかないかで制御を分ける。
:  pidファイルがあれば、記述中のプロセスIDについて、${0}と同一コマンドのプロセスか確認する。
if [ -e ${pidfile} ]
then
        :
        : ${pidfile}がある場合、${pidfile}からプロセスIDの情報を抽出する。
        run_pid=`cat ${pidfile}`
        :
        : すでに走っていると思われるこのスクリプトのPID : ${run_pid}

        :
        : psコマンドを使用して、このスクリプトの名前:${0}を含むプロセスをすべて抽出し、${run_pid}と比較する。
        for chk_pid in `ps axww | grep ${0##*/} | awk '{print $1,$5}' | grep -v grep | cut -f1
-d' '`
        do
                if [ "o${chk_pid}" = "o${run_pid}" ]
                then
                        :
                        : ${run_pid}と${chk_pid}が一致する場合は、このスクリプトの実行を停止する
                        echo "stopped."
                        :
                        : スクリプトを終了する
                        exit
                fi
        done
        :
        : 上記のループで${run_pid}と${chk_pid}がすべて一致しなかった場合、pidファイルの削除漏れが考えられるので、${pidfile}を削除する。
        rm ${pidfile}
else
        :
        : pidファイルがそもそも存在しない場合は、特に何もしない。
fi

:
: このスクリプトのpid:${$}を${pidfile}に格納する。 ※改行コードは含まないようにする。
echo -n ${$} > ${pidfile}

: この後に実行するスクリプトを書いていく・・・
:
:
:
:
:実行終了したら、pidファイルは削除する。
rm ${pidfile}
: この記事はここで終わり。

コメント