home wiki.fukuchiharuki.me
Menu

キーワード

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

参考