进程.spawn挂起

3
我正在使用Celluloid创建作业处理服务器。我拥有一个工作池,其中的工作人员从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脚本已经在生产中使用了几个月,但是在定期执行上。所以唯一改变的是它们现在是从这个新的作业处理器中执行的。

我是不是方法错了?Ruby是否会暂停/休眠进程或类似的事情- 我没有正确读取输出导致阻塞?

---编辑 ---

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

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

到目前为止,这个方法没有问题。使用反引号有什么不同呢?
1个回答

0

我认为这与Ruby启动子进程的方式以及随后与它们交互的方式有关。

我自己对此并不了解太多,但是我发现this在理解生成子进程的不同方式以及何时使用它们方面非常有用。

我已经使用了Celluloid很长一段时间,我认为这与你遇到的问题无关。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接