このエントリーをはてなブックマークに追加


シェルスクリプトの二重起動(多重起動)を禁止する

本記事はシェルスクリプトの二重起動(多重起動)を防止するためのサンプルスクリプトを記しています。


スポンサーリンク

参考サイト

二重起動サンプルスクリプト

01: #!/bin/bash
02: 
03: if [ $$ != `pgrep -fo $0`  ]; then
04:   echo `basename $0` is already running.
05:   exit 1
06: fi
07: 
08: # Script Body
09: for i in `seq 1 5`
10: do
11:   echo "Hello PID=$$"
12:   sleep 1
13: done

二重起動(多重起動)を防止しているのは3行目〜6行目になります。
pgrepの値と$$が同じであれば、初めての起動になります。
pgrepの値と$$が異なるのであれば、既に同一のシェルスクリプトが動作してる事になります。

サンプルスクリプトの実行結果

上記のサンプルスクリプトを起動してみました。
以下のようになります。

sakura@ubuntu:~$ ./multi_start_chk.sh & ./multi_start_chk.sh 
[1] 1621
Hello PID=1621
multi_start_chk.sh is already running.
sakura@ubuntu:~$ Hello PID=1621
Hello PID=1621
Hello PID=1621
Hello PID=1621

[1]+  終了                  ./multi_start_chk.sh

bash -x にて実行した場合は以下の出力でした。
PIDによる比較がされているのが確認できます。
bash -xについては以下の記事を参考にしてください。

  • シェルスクリプトのデバッグ方法
    sakura@ubuntu:~$ bash -x multi_start_chk.sh & bash -x multi_start_chk.sh 
    [1] 1666
    ++ pgrep -fo multi_start_chk.sh
    ++ pgrep -fo multi_start_chk.sh
    + '[' 1666 '!=' 1666 ']'
    + '[' 1667 '!=' 1666 ']'
    ++ seq 1 5
    ++ basename multi_start_chk.sh
    + for i in '`seq 1 5`'
    + echo 'Hello PID=1666'
    Hello PID=1666
    + sleep 1
    + echo multi_start_chk.sh is already running.
    multi_start_chk.sh is already running.
    + exit 1
    sakura@ubuntu:~$ + for i in '`seq 1 5`'
    + echo 'Hello PID=1666'
    Hello PID=1666
    + sleep 1
    + for i in '`seq 1 5`'
    + echo 'Hello PID=1666'
    Hello PID=1666
    + sleep 1
    + for i in '`seq 1 5`'
    + echo 'Hello PID=1666'
    Hello PID=1666
    + sleep 1
    + for i in '`seq 1 5`'
    + echo 'Hello PID=1666'
    Hello PID=1666
    + sleep 1
    
    [1]+  終了                  bash -x multi_start_chk.sh

関連資料


添付ファイル: filemulti_start_chk.sh 415件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-03-20 (金) 22:27:02 (1308d)