SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

コマンドライン版phpの簡易多重起動防止

問題

crontabで起動するコマンドライン版のphpの処理が時間がかかるようになってしまって、同じ処理が重複して複数起動してしまうようになった。

重複起動のチェックはできる?

解答例

ロック用のファイルなどを作って対応するのが正しいと思いますが、万が一重複して起動しても、負荷が高まる程度であまり重大な事態にならないものであれば、簡易のチェックで済ますのはどうでしょう。

「/ust/local/bin/php hogehoge.php」 のような形で起動している場合、psコマンドでプロセスを確認したときもそのように表示される。psコマンドで先行するプロセスがあるかどうか確認して、もしあれば自分は何もしないで終わるようにする。

<?php
//同じphpを起動している他のプロセスを探し
exec("ps x | grep 自身のファイル名.php | grep -v grep", $output, $result);

//2個以上見つかれば
if(count($output) > 1){
    //中断する
    exit();
}

//先客がいなければ、続行する

//...処理を続ける...

なお、上記の方法では、スクリプトのファイル名に”grep”の文字列が入ってるとき、grep -v grep により、件数がちゃんと出てこないので、その場合は要調整です。

関連するメモ

コメント(2)

take 2012年2月8日 15:56

シェルスクリプトですが、以前、pidofを使って失敗したことがあります。

  if [ -z `pidof rsync` ]; then
    :
  fi

プロンプトから実行するとうまくいくのに、cronに仕込むと
常に真になってしまいます。BSD式にプロンプトを持たないとだめなのかも。
で、結局、オーソドックスにロックファイルを使うことに。

if [ ! -e /tmp/rsync.lock ]; then
        touch /tmp/rsync.lock
  :
rm -f /tmp/rsync.lock
fi

mpyw 2015年9月16日 11:03

もっと簡単に書けます。PHPを使うならこれ1択です。

プロセスの多重起動をアドバイザリロックで防止する for PHP
http://qiita.com/ngyuki/items/5cb004dba45b0adaa9f7