キーワード†
- bash
- プロセスID
- 多重起動
- cron
現象†
次のようにプロセスIDをみて多重起動判定しようとする。手動でスクリプトをキックした場合はよいが、cronからキックすると必ず多重起動であると判定されてしまう。
OLDEST=$(pgrep -fo $0) if [ $$ != $OLDEST ] then
原因†
親プロセスがOLDESTになってしまうため。
cronで実行するとふたつのプロセスが上がる。
/bin/sh スクリプト /bin/sh -c スクリプト
上が実際に動かしたいスクリプトのプロセス、下がcronに設定したコマンドを文字列として入力してキックしているプロセスである。OLDESTには後者のプロセスが拾われてしまう。
対策†
「OLDESTが親プロセスとも違う」を多重起動判定の条件に加える。
OLDEST=$(pgrep -fo $0) if [ $$ != $OLDEST ] && [ $PPID != $OLDEST ] then
cronからキックした場合はOLDESTが親プロセス($PPID)と同じになる。手動でキックした場合はOLDESTがこのプロセス($$)と同じになる。
備考†
$PPIDで親プロセスのプロセスIDが取得できる。手動でキックした場合はシェルが親になっている。