Process.spawn挂起

时间:2013-04-24 08:46:53

标签: ruby process celluloid

我正在使用Celluloid来创建作业处理服务器。我有一个pool个工作者从beanstalkd队列中获取任务,并使用Process.spawn来调用一个执行大量工作的PHP脚本来处理它。

以下是我执行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是否会以某种方式暂停/暂停这个过程或类似的东西 - 我是不是正确地阅读了输出并且阻止了它?

---编辑---

我切换到使用反引号运算符来执行命令(阻塞并不重要,因为Celluloid Actor是异步的):

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

到目前为止,这是有效的。如何使用反引号不同?

1 个答案:

答案 0 :(得分:0)

我认为这与Ruby启动子流程的方式有关,并随后与它们进行交互。

我自己并不知道有多少,但我发现this对于理解产生子流程的不同方法以及何时使用它们非常有用。

使用了Celluloid,我认为这与您遇到的问题无关。