8

サブプロセスをフォークしようとしています。終了するのを待ちます。一定の時間内に終了しない場合は、サブプロセスを強制終了します。

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

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秒間待機させたいのですが、プロセスがまだそこにある場合は、それを強制終了して出力を「エラー」としてマークしたいと思います。

私はfork/execを初めて使用します。私のコードは実際にフォークしますが、それの待機/殺害の側面にアプローチする方法がわかりません。

4

2 に答える 2

11

Timeoutモジュールを使用します: ( 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
于 2012-09-24T20:37:20.320 に答える
0

subexecの機会を与えてください。README から:

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

CLI の Ruby ラッパーであるライブラリに役立ちます。たとえば、ImageMagick の mogrify コマンドを使用して画像のサイズを変更すると、停止することがあり、制御が元のプロセスに戻ることはありません。サブエグゼクティブを入力します。

于 2012-09-24T20:40:02.083 に答える