【Linux】バッチが重複実行する悪夢

wgetコマンドは標準では
「タイムアウトすると再実行する」という性質があります。

PHPで書いた処理を
wgetで呼び出すシェルスクリプトを
cronで実行する
というバッチ処理を組みました。

しかし処理時間の目測を誤り、wgetがタイムアウトしてしまったため、
内部でPHPは実行中にもかかわらず
もう一度PHPが実行されてしまいました。

これを防ぐには、タイムアウト時間を長くとるか、
実行回数を1回にするオプションを指定します。

【PHP】cronでWEBアクセスと全く同じ動作を行いたい

ブラウザで動作するWEBシステムで、
使用しているプログラムをcronから呼んだらうまくいかない、
WEBアクセスしたときと結果が違う、
ということはないでしょうか。

cronからPHPをコマンドで実行した場合、
環境変数などの実行環境がWEBとは異なるため
全く同じ動作を行う保証がなく、予測しにくい不具合を生みます。

そこで私は、バッチ処理などでcronからphpを呼ぶ場合は
wgetを使っています。

こんな感じでwgetを呼ぶシェルをcronにセットするだけです。

batch.sh

これでWEBアクセスと同じ動作を行わせることができます。

重複実行防止処理はphp側で行っています。
もし時間のかかる処理ならwgetのオプションにタイムアウトの指定をします。