3

我正在使用赛璐珞创建作业处理服务器。我有一个工作人员,它们从 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 是否以某种方式暂停/休眠进程或类似的东西——我没有正确读取输出并且阻止它吗?

- - 编辑 - -

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

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

到目前为止,这没有问题。使用反引号有何不同?

4

1 回答 1

0

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

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

使用赛璐珞有点远,我认为这与您遇到的问题无关。

于 2013-05-23T12:10:23.377 回答