読者です 読者をやめる 読者になる 読者になる

kitak.blog

Kみたいなエンジニアになりたいブログ

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になります.