二重起動の防止

同僚から、シェルで二重起動防止を実現するにはということを相談される。
パッと思いつくのはlockファイルを使ったパターン。
が、今回はpsの結果から取るようにしたいと言う。
で、実際に書いてみた。

test.sh
PIDS=`ps -C "sh test.sh" -o pid=`

for PID in $PIDS
do
  if [ $PID != '' ]; then
    if [ $PID != $$ ]; then
      echo "shell already started"
      exit
    fi
  fi
done

sleep 30
ポイント
  • psコマンドの-oオプションで出力するデータを選べる
  • 自分のプロセスIDは$$で取得できる
  • psの結果は複数になるかもしれない