pidof
コマンドを使う (稼働中のプロセスIDを返す)
||
で繋げてコマンド実行すればOK/proc/$$/comm
あたりと同じ動作なので、スクリプトの場合bash
が入ってしまうpidof -x foo
のように-x
を入れるとスクリプトは対応できる
基本、 ps foo | grep
相当なので、同名スクリプトは誤検出してしまう
- 複数のディレクトリで別の
./run.sh
を実行している場合など
crontab
15 5-21 * * * /data/gunosy-feeder/run
30 5-21 * * * /data/sodsp-feeder/run
/tmp/a/run.sh
とフルパスで実行して、pidof -x /tmp/a/run.sh
なら対応可能- しかし、cron 以外に人手で
cd /tmp/a && ./run.sh
とかされると無力
run
みたいなのをやめて、もう別名にする。シンプルで全てが解決する。psにも優しい- 今後作る時はこれがよいが、既存プロジェクトには厳しい
- 名前を変更できない場合、スクリプトであれば起動するプロセス名を
exec -a foo
で明示できる
before
make once 2>&1 >> cron.log
after
pidof -x gunosy-feeder > /dev/null || exec -a gunosy-feeder make once 2>&1 >> cron.log