何があったのか
処理対象がなくなるまでループ処理することってありますよね。
そんなときついつい無限ループ+終了時にbreak
ってやってしまいがちですが。
example.rb
i = 0
while true do
break unless calcurate_function(i) #処理対象がなかったらfalseを返す
i += 1
end
何らかの不具合で、calcurate_function
が処理対象がなくなってもtrue
を返し続けたら・・・。無限ループの完成です。
手動で動かしたバッチならしばらく経ってから異変に気付いてプロセスをkill
したりもできますが、これが深夜に自動で動いているバッチ処理だったとしたら・・・。
私はこれで本番サーバをフリーズさせて、IDCまで電源をいれに行ったことがあります。
どうすればよかったのか
それ以来無限ループ恐怖症になり、必ず有限ループにしています。
example.rb
# 仕様上そんなにループすることのないはずのめっちゃでかい数字
MAX_LOOP = 999_999_999
i = 0
while i < MAX_LOOP do
break unless calcurate_function(i) #処理対象がなかったらfalseを返す
i += 1
end
これはこれで、いつかMAX_LOOPを超える回数ループする必要が出た時にどうするんだという話もありますが、未来の自分のことまで考えるなら、終了時にやり残しがないかチェックをすることくらいでしょうか。
一番良いのはジョブスケジューリングツールでバッチプロセスを監視して、異常に長い時間動いているプロセスがあったら通知してくれたりすることなんですけどね。