2012-09-24 14 views
5

私はサブプロセスをフォークしようとしています。終了するまで待ってください。一定時間内に終了しない場合は、終了してください。Rubyの子pidが終了するのを待っています

これは私がこれまで持っているものです。

servers.each do |server| 
    pid = fork do 
     puts "Forking #{server}." 
     output = "doing stuff here" 
     puts output 
    end 

    Process.wait 
    puts "#{server} child exited, pid = #{pid}" 
end 

Process.waitの周りに、私は20秒を待つようにユーティリティのいくつかの並べ替えをしたいと思い、そしてプロセスはまだそこであれば、私は」どこか/後それを殺して "ERROR"と出力するのが好きです。

私はfork/execが初めてです。私のコードは実際に作業をフォークしていますが、私はちょうどそれの待機/殺害の側面にアプローチする方法を知らない。

答えて

9

使用Timeout module:(http://www.whatastruggle.com/timeout-a-subprocess-in-rubyからコード)

require 'timeout' 

servers.each do |server| 
    pid = fork do 
     puts "Forking #{server}." 
     output = "doing stuff here" 
     puts output 
    end 

    begin 
     Timeout.timeout(20) do 
      Process.wait 
     end 
    rescue Timeout::Error 
     Process.kill 9, pid 
     # collect status so it doesn't stick around as zombie process 
     Process.wait pid 
    end 
    puts "#{server} child exited, pid = #{pid}" 
end 
+0

これはPERFECT! – awojo

0

subexecにチャンスを与えます。 READMEから:

Subexecは、オプションのタイムアウトパラメータを使用して外部コマンドを生成する単純なライブラリです。 Ruby 1.9のProcess.spawnメソッドに依存しています。また、同期コードと非同期コードで動作します。

CLI用のRubyラッパーであるライブラリに役立ちます。たとえば、ImageMagickのmogrifyコマンドでイメージのサイズを変更すると、処理が停止し、元のプロセスに制御が返されないことがあります。サブエックスを入力してください。

関連する問題