2

重複の可能性:
Ruby でバックグラウンド プロセスを生成する

これを突っついて数日過ごしました。最近までOSからruby1.8.7を使っていました。バッククォートでサブシェルを呼び出します。サブシェルは、stdout と stderr の両方を閉じた状態でバックグラウンドで任意のプログラムを実行する bash ラッパーでした。その後、disown を実行して init にプロセスを引き継がせ、すぐに復帰しました。これは何年もうまく機能し、このループプロセスがバックグラウンドでジョブを開始し、すぐに「はい、実行されました。それだけです」と報告しました。

すべてをrvm 1.9.3にアップグレードしましたが、このトリックを除いてすべて問題ありません。認めたくないというよりも、ハッキングではないかと疑い始めています。1.9.3 では、そのサブシェルを生成すると常に EPIPE エラーが発生します。パイプが壊れているとのことです。私が 1.8.7 で行っていたことはちょっとひどいように思えるので、1.9.3 では機能しないことを受け入れることができます。

system コマンドを使用してみましたが、open3:popen2 を試しました。彼らはまた、disown ラッパーを呼び出して私と一緒に EPIPE を投げます。

#!/bin/bash

# this will crash ruby if you keep trying to read from it.
$* >&- &

disown %1

これは disown ラッパーです。Rubyには次のようなものがあります

    r=`/usr/local/bin/disown /usr/local/bin/job.sh`

そして、これが実行されると、スローされます

/usr/local/bin/runner.rb:88:in ``': Broken pipe (Errno::EPIPE)

(ゼロ) 出力を r 変数に代入しない場合、効果は同じです。システム関数と Open3:popen2 を使用します。

したがって、私の目標は、コマンドが戻ってくるのを待たずに、単純に ruby​​ からコマンドを実行することです。数時間かかりますが、追跡する必要はありません。スポーンするだけです。ruby がもはやこれを行うことができないように聞こえ始めた場合、または私の disown ラッパーがあまりにも凶悪で承認を得ることができない場合は、ワーカー スレッド プールを試すかもしれません。Ok。ありがとう。

*編集: すばらしい回答をありがとうございます。キャスパーは、私がルビー用語をもっとうまく扱えていれば、おそらくこれに焦点を合わせていたであろうことを教えてくれたと思います. これが少し歩行者である場合は申し訳ありません。皆さん、素早い回答に感謝します!

4

3 に答える 3

3

さて、あなたは自分自身に答えましたProcess.spawn::

Process.spawn("something");
于 2012-12-06T02:41:30.000 に答える
2

デーモンの gemをチェックしてください。次に、次のことができます。

require 'daemons'
Daemons.run('some_script.rb')
于 2012-12-06T02:29:10.330 に答える
2

Ruby 1.9.3では、使用できます

 Process.fork do
   # do your long time job
 end
于 2012-12-06T02:31:02.263 に答える