私はさまざまなジョブを実行するための Ruby フレームワークを開発しています。私がする必要があることの 1 つは、これらのジョブの出力を使用してすべてを整理するためにいつ終了したかを知ることです。私は問題なく使用していますが、一部の同僚が別のシステムで使用し始めており、非常に奇妙なことが起こっています. 私がしているのは、次を使用してコマンドを実行することです
i,o,e,t = Open3.popen3(job.get_cmd)
p = t.pid
後で、ジョブが次のように終了したかどうかを確認します。
begin
Process.getpgid(p)
rescue Errno::ESRCH
# The process ended
end
私が実行しているシステム(Scientifi linux 6)では完全に動作しますが、私の友人がUbuntu 14.04(ruby 1.9.3p484を使用)で実行を開始したとき、コマンドはcmd1 && cmd2 && cmd3
各コマンドが同時に実行されるなどのコマンドの連結です次々にではなく、システムによって返された pid は、t.pid
実行されているさまざまなプロセスの pid のいずれでもありません。
コードを変更し、コマンドの連結を実行する代わりに、popen3 から呼び出されたコマンド内のすべてのコマンドを含むスクリプトを作成しますOpen3.popen3("./script.sh")
が、動作は同じです...すべてのコマンドが同時に実行され、その pid ruby は、どのプロセス pid でもないことを知っています...
これがルビー関連のものかどうかはわかりませんがscript.sh
、手動で実行すると期待どおりに動作し、コマンドを次々に実行するため、ルビーがそれに応じてプロセスを起動していないか、システムがプロセスを適切に読み取っていないようです。何が起こっているのか知っていますか?
どうもありがとう!
編集:実行中のコマンドは次のようになります
./myFit.exe h vlq.config &> output_h.txt && ./myFit.exe d vlq.config &> output_d.txt && ./myFit.exe p vlq.config &> output_p.txt
このコマンドは、Ruby スクリプト内ではなく手動で実行すると、完全に実行されます。まさにこのコマンドです。ruby スクリプトから実行すると、すべての myFit.exe 実行が同時に実行されます (ただし、&& を使用して実行する必要があるため、前のスクリプトが正常に機能する場合はそれらを実行する必要があります)。Myfit.exe は、フィットさせるためのツールであり、システム コマンドではありません。繰り返しますが、このコマンドは、手動で実行すると完全に実行されます。