home wiki.fukuchiharuki.me
Menu

* キーワード [#q5ccb86c]
- bash
- プロセスID
- 多重起動
- cron

* 現象 [#t9e3bd5b]

次のようにプロセスIDをみて多重起動判定しようとする。手動でスクリプトをキックした場合はよいが、cronからキックすると必ず多重起動であると判定されてしまう。

 OLDEST=$(pgrep -fo $0)
 if [ $$ != $OLDEST ]
 then

* 原因 [#rc7486c7]

親プロセスがOLDESTになってしまうため。

cronで実行するとふたつのプロセスが上がる。

 /bin/sh スクリプト
 /bin/sh -c スクリプト

上が実際に動かしたいスクリプトのプロセス、下がcronに設定したコマンドを文字列として入力してキックしているプロセスである。OLDESTには後者のプロセスが拾われてしまう。

* 対策 [#b22cfbf7]

「OLDESTが親プロセスとも違う」を多重起動判定の条件に加える。

 OLDEST=$(pgrep -fo $0)
 if [ $$ != $OLDEST ] && [ $PPID != $OLDEST ]
 then

cronからキックした場合はOLDESTが親プロセス($PPID)と同じになる。手動でキックした場合はOLDESTがこのプロセス($$)と同じになる。

* 備考 [#yed2e47a]

$PPIDで親プロセスのプロセス番号が取得できる。手動でキックした場合はシェルが親になっている。
$PPIDで親プロセスのプロセスIDが取得できる。手動でキックした場合はシェルが親になっている。

* 参考 [#o08668c4]
- [[メモOFF: cronから起動されたスクリプトの多重起動チェック>http://memo-off.blogspot.jp/2015/08/cron.html]]