ShellScript
シェルスクリプト
timeout
タイムアウト

シェルスクリプトで実行時間の長いプログラムをタイムアウトさせて、処理を分ける方法

More than 1 year has passed since last update.

シェルスクリプトで、コマンドまたはプログラムをたくさん回す機会はよくあります。
その時に、プログラムのバグや、想定外のファイルのせいで膨大な時間がかかってしまうこともしばしばです。
そういうときは、処理時間が一定より長いモノに関してはスキップしたかったり、別の処理をさせたい時があります。
そんなときは、 timeout コマンドが便利です。
(Macの場合は gtimeout ってやつを使いました)
使い方は以下です。

timeout -sKILL [秒数] [実行するコマンド]

指定した秒数たってもコマンドが終了しない場合は、KILLシグナルが送られ、コマンドが強制終了されます。

加えて、タイムアウトしたとき、しなかったときで別の処理をシェルスクリプトが記述したい要望があります。

そんなときは、自分は以下のようにしました。

# timeoutコマンド実行 
timeout -sKILL 5 [実行したいコマンド・プログラム] 

# $? が 0 ならば正常終了、それ以外は異常終了                                                                                            
if [ $? != 0 ]; then 

  # タイムアウトしたときの処理
  echo "タイムアウト!!"

else

  # 正常終了したときの処理
  echo "正常終了"

fi

このスクリプトは、タイムアウトすれば「タイムアウト!!」と表示され、正常終了すれば、「正常終了」と出るだけのスクリプトです。
$?には直前のコマンドの終了ステータスが入るので、これを活用いたしました。

シェルスクリプト内に組み込めば、想定外のファイルやバグに対して時間短縮が可能なのではないでしょうか。
思いつきで作ったので、ベストな方法があれば教えていただきたいです!

【追記】
@tenmyo さんにご指摘いただいたものを反映しました!
ありがとうございました!!

タイムアウト
異常終了
場合分け