シェルスクリプトの多重起動を防ぎたい!
これでいいかな?
すでに他のプロセスで起動していたら何もせずに終了する。
if [ $$ != `pgrep -fo $0` ]; then exit 1 fi
$$ | 自分のプロセスID |
---|---|
pgrep | プロセスをgrepしてプロセスIDのリスト返す |
-f | プロセス名だけではなくて引数などコマンド全体を検索対象にする(ps -fの値ということ) |
-o | マッチした中で一番古いプロセスIDだけを返す |
$0 | 起動時の自分の名前 |
呼び出し毎に引数が違う場合は$0の代わりにbasename $0"$0 $@"を使えばいいかな。
参考
以下はロックファイルで制御し、異常終了時はtrapで対処するというもの。
- MSN Japan - ニュース, 天気, メール (Outlook, Hotmail), Bing検索, Skype
- http://gry.sakura.ne.jp/2009/02/05/%E5%A4%9A%E9%87%8D%E8%B5%B7%E5%8B%95%E3%82%92%E7%A6%81%E6%AD%A2%E3%81%99%E3%82%8B%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88/
- シェルスクリプト(/bin/sh)で排他処理をしたいです。 良い方法は… - 人力検索はてな
- シェルスクリプトで正しい二重起動チェックを解説しているページ… - 人力検索はてな
- シェルスクリプトを多重起動しないようにする - 西尾泰和のはてなダイアリー lockfileというコマンドがあるらしい。
もうちょっと詳しい説明付き(cronでスクリプトを動かすときは上記の書き方だとだめなのでその対処法も)