[[ $$ != `pgrep -fo "$0"` ]] echo "$0 is already running" && exit 2
これは、自身と同じプロセス名を検索して、
そのもっとも古いプロセスIDが自身のプロセスIDと一致していればおーけー
という処理になります。
ただ、これは直接スクリプトを実行した場合にのみ有効で
cronなどから子プロセスそしてスクリプトを実行した場合は
$$は子プロセスとして起動されたスクリプトのプロセスID
pgrep -fo "$0"で引っかかってくるのが起動元の親プロセスのIDとなり
一致しないので、多重起動として扱われてしまいました(´・ω・`)
これに対応するため、親プロセスIDが格納される$PPIDとの比較も追加して次のようにしてみました
[[ $$ != `pgrep -fo "$0"` ]] && [[ $PPID != `pgrep -fo "$0"` ]] && echo "$0 is already running" && exit 2
これで、直接起動した場合も、cronなどから子プロセスとして起動した場合も多重起動チェックできますヾ(*・ω・)シ
0 件のコメント:
コメントを投稿