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で親プロセスのプロセス番号が取得できる。手動でキックした場合はシェルが親になっている。

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