2017-10-28 9 views
0

クロスプラットフォームソリューション(GNU/Linux、Windows)を使用して、バックグラウンドで外部プログラムを生成し、それをキャプチャしてpidとし、後でストアードpidを介してプログラムを停止します。Process.spawn(Ruby 1.9.x):産卵が成功し、エラーを検出する方法を確認するには?

のRuby 1.9.xにこのコードを考えてみましょう:/ stderrの

pid = Process.spawn("xxx") 
puts pid 

標準出力:

8117 
sh: 1: xxx: not found 

も例外がスローされていない、と私は事実を検出する方法が表示されませんスポーンが成功しなかったことを示します(xxxは有効なコマンドではありません)。

このスポーンが成功しなかったことを検出する最良の方法は何ですか?

答えて

1

はプロセスIDを返します。プロセスIDが返ってくると、技術的には機能自体は失敗しませんでした。 Ruby> = 2.0.0の場合、Process#spawnはコマンドを見つけることができない場合Errno::ENOENTをスローします。 Ruby 1.9はサポートされていないので、Rubyをアップグレードするのが最善の解決策です。

ハックは、呼び出しが返った後にプロセスが実際に実行されているかどうかをテストするのに役立ちます。残念ながら、これはプラットフォーム固有のものになります。

pid = Process.spawn("xxx") 
case RUBY_PLATFORM 
when /linux/i 
    success = File.exist?("/proc/#{pid}") 
when /windows/i 
    # use win32api gem, Windows API call EnumProcesses 
else 
    # ? 
end 

残念ながら、プロセスがその存在をテストするまでに完了した場合は、わかりません。おそらく、その結果(それが何であれ)をチェックして、それがそれをしたかどうかを確認することもできます。

もう1つの方法は、起動するプログラムを制御する場合、名前付きパイプを起動する前に開き、実行中のパイプでRubyプログラムにメッセージを送信することです。 spawn呼び出しの後にパイプから読み込み、非ブロック的な方法でTimeoutを使用して、それが永遠にブロックされないようにすることができます。もっとシンプルでクリーンでない方法は、そのプログラムが決定的なものをファイルに書き込ませて、単純なFile.exist?テストを使ってそこにあるかどうかを確認することです。

+0

これは役に立ちました。ありがとうございました。 – cschol

関連する問題