2012-08-16 25 views
11

私はtest.shという名前のシェルスクリプトを持っています。 Rubyからtest.shを起動するにはどうすればよいですか?Rubyでシェルスクリプトを起動し、バックグラウンド(非同期)で実行するにはどうすればよいですか?

私はtest.shをバックグラウンドプロセスとして実行したいのですが、Rubyではansync呼び出しであることを意味します。

STDERRとSTDOUTも特定のファイルに書き込む必要があります。

アイデア?

答えて

25

ができますが、プロセスが戻るのを待ちませんKernel.spawn()、考えるかもしれません:あなたはspawn()または手動でfork()system()を使用するかどうかのマニュアルに従って、

pid = spawn("./test.sh") 
Process.detach(pid) 

は注意を、終了する前に、PIDを取得してProcess.detach()またはProcess.wait()のいずれかを指定する必要があります。標準エラー出力をリダイレクトについて

は、それはspawn()に簡単です:

pid = spawn("./test.sh", :out => "test.out", :err => "test.err") 
Process.detach(pid) 
+0

ニース、また、Windowsで動作します! test.outに書き込む複数のプロセスがありますが、いくつかの行が文字化けしています。 – peter

+0

@peterそう、複数のプロセスから同時に同じファイルにバッファリングされた書き込みを行うと、実際にいくつかの行が壊れてしまいます。この問題にはいくつかの解決策がありますが、最も簡単なのは各プロセスから別々のファイルに書き込むことです。それ以外の場合は、出力を多重化する別のプロセスが必要になるでしょう。 –

8

はこれを試してみてください:

Process.fork { system "./test.sh" } 

は、あなたがスレッドを使用できるのWindows上で動作しません。 TanzeebKhaliliの回答作品@

関連する問題