3

Celluloidを使用してジョブ処理サーバーを作成しています。私は、Beanstalkd キューからタスクを取得し、一連の作業を行うPHP スクリプトを呼び出すことによってそれを処理するワーカーのプールを持っています。Process.spawn

PHPコマンドを実行する方法は次のとおりです。

rout, wout = ::IO.pipe
pid = Process.spawn(cmd, :err=> :out, :out => wout)
_, exit_status = Process.wait2(pid)
wout.close
output = rout.readlines.join("\n")

これは「ほとんど」の場合に機能します。何百ものジョブでテストを行いましたが、すべて正常に処理されました。しかし、本番環境に置くと、一部のPHP コマンドが無期限にハングします。

ハングしたプロセスを強制終了し、PHP コマンドが書き込むログファイルを見ると、最後のログ メッセージはランダムに見える目立たないイベントの数です (つまり、プロセスがハングするまでのプロセスのパターンを識別できません)。 .

ジョブを処理するための PHP スクリプトは、本番環境で数か月間使用されてきましたが、cron で実行されました。変更された唯一の点は、代わりにこの新しいジョブ プロセッサから実行されていることです。

私はこれに間違った方法でアプローチしていますか? Ruby が何らかの形でプロセスを一時停止/スリープ状態にしているのでしょうか?出力を適切に読み取っていないためにブロックされているのでしょうか?

- - 編集 - -

バックティック演算子を使用してコマンドを実行するように切り替えました (セルロイド アクターは非同期であるため、ブロックは問題になりません)。

output = `#{cmd}`
pid = $?.pid
exit_status = $?.exitstatus

これまでのところ、これは問題なく機能しています。バッククォートの使用方法はどのように異なりますか?

4

1 に答える 1