cronで時間のかかるPerlスクリプトを実行したときの完了確認

| コメント(0) | トラックバック(0)
WEBブラウザで処理時間の長いCGIなんかを実行したとき、apacheのTimeOutの設定によっては最後までスクリプトが実行されないで終わってしまうのは言うまでもない。

レンサバなどでこういった時間のかかるスクリプトをcron起動させているユーザは、cronの結果がメールで届くまでは、ブラウザからしか実行の完了確認ができないのでは?と、ふと思った。

ローカル環境でない場合、httpdの接続タイムアウトが例えば120秒に設定されていて、起動させるスクリプトが終了するまでに180秒かかるものだったら、WEB上ではタイムアウトになってしまうためユーザはほんとうに最後までちゃんと実行されているのか非常に不安になるはずだ。

特にある程度の量のメール送信機能が組み込まれたスクリプトだと、相手にちゃんと届いているのかすぐに判断できない。
しかも知らないうちにサーバ管理者がCGIの実行時間の制限なんかしていたらもっと都合が悪い。

まあ、結局cron実行結果のメールを見れば分かるのだが、なんか効率悪いので、わかりやすいようなかたちで検証してみた。


まず/etc/httpd/conf/httpd.conf の設定で、ブラウザの接続タイムアウト時間を一時的に10秒に変更。


TimeOut : 120
   ↓
TimeOut : 10

httpdを再起動する。


次に、「timeout.cgi」とか名前を付けたファイルを任意の場所(ここでは/var/www)に作成し、以下のように記述。

------------------------------------------

#!/usr/bin/perl

print "60秒sleep start...\n";
sleep 60;   #60秒待つ
print "60秒経過しました。sleep end.\n";
print "apacheのタイムアウトは10秒ですが、スクリプトは最後まで実行されました。\n";
exit;

----------------------------------------------

このファイルを実行権限を付加して保存。



コマンドラインからこのファイルを実行。

# cd /var/www
# perl timeout.cgi


【結果】

60秒sleep start...
(60秒間カーソル点滅)
60秒経過しました。sleep end.
apacheのタイムアウトは10秒ですが、スクリプトは最後まで実行されました。




・・・というわけで、
レンサバでcron動かしてる人たちは、ローカルできちんと動作確認できていれば、crontabの書き方が間違ってない限りちゃんとスクリプトは最後まで動きますよ!

・・・ということがわかってもらえたと思う。

トラックバック(0)

トラックバックURL: http://www.igreks.jp/blog/mt-tb.cgi/224

コメントする