systemuでタイムアウトを設定する
こんにちは. 今, つくっているプログラムで外部コマンドを呼び出すためのsystemuというgemを利用しています. コマンドの処理時間が長い場合にタイムアウトを設定したかったので, まとめておきます.
require 'systemu' has_timed_out = false timeout_sec = 10 systemu 'something command...' do |pid| sleep timeout_sec has_timed_out = true Process.kill 9, pid end # プロセスが通常に終了した場合はfalse # タイムアウトで終了した場合はtrue p has_timed_out
systemuメソッドに渡すブロックは, systemuが実行するコマンド('something command...'の部分)のバックグラウンドで実行されます.
ブロックでは, timeout_sec秒, 処理をストップして, ストップしている間にコマンドが終了していなければ, プロセスを終了させます. ブロックの外にタイムアウトで終了したかどうか判断するためのフラグを用意しておきます(has_timed_out). もし, タイムアウトで終了した場合には, trueになります.