timeoutコマンドによる指定時間経過時の処理切り替え

仕事で、わざわざその為にスクリプトを組むのも面倒な、プロセス停止に時間がかかるようであればプロセスをkillしてしまうという対応があった。
面倒なのでワンライナーで対処できないかなぁ。。。と思い調べたところ、Linuxのディストリではtimeoutコマンドというものが用意されているようだ。

使い方は簡単で、以下のようにtimeoutコマンドを実行するだけだ。

timeout 待機時間(秒) 実行コマンド

で、実行コマンドが待機秒内で終了しない場合、exitコード124で異常終了する。

[root@BS-PUB-CENT7-01 ~]# # 5秒でタイムアウト(2秒sleep)
[root@BS-PUB-CENT7-01 ~]# time timeout 5 sleep 2;echo $?

real    0m2.005s
user    0m0.001s
sys     0m0.003s
0
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # 5秒でタイムアウト(10秒sleep)
[root@BS-PUB-CENT7-01 ~]# time timeout 5 sleep 10;echo $?

real    0m5.004s
user    0m0.001s
sys     0m0.003s
124

ということは、以下のように記述することでタイムアウト時の分岐処理を一行で記述できる。

timeout 待機時間(秒) 実行コマンド || timeout時の実行コマンド

[root@BS-PUB-CENT7-01 ~]# # 5秒でタイムアウト(2秒sleep)
[root@BS-PUB-CENT7-01 ~]# time timeout 5 sleep 2 || echo "Timeout Error"

real    0m2.005s
user    0m0.002s
sys     0m0.003s
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # 5秒でタイムアウト(10秒sleep)
[root@BS-PUB-CENT7-01 ~]# time timeout 5 sleep 10 || echo "Timeout Error"

real    0m5.003s
user    0m0.000s
sys     0m0.004s
Timeout Error

これで、ひとまずは対処出来たかな。