我正在使用赛洛尔创建作业处理服务器。我有一个工作人员的池子,它从beanstalkd队列中获取一个任务,并通过使用Process.spawn调用一个执行大量工作的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是以某种方式暂停/休眠过程还是类似的--我是不是没有正确地读取输出,从而阻止了它呢?
--编辑--
我转而使用回勾操作符来执行命令(阻塞并不重要,因为Celluloid是异步的):
output = `#{cmd}`
pid = $?.pid
exit_status = $?.exitstatus到目前为止,这是没有问题的。后背的使用有何不同?
发布于 2013-05-23 12:10:23
https://stackoverflow.com/questions/16187451
复制相似问题