首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Process.spawn悬挂

Process.spawn悬挂
EN

Stack Overflow用户
提问于 2013-04-24 08:46:53
回答 1查看 578关注 0票数 3

我正在使用赛洛尔创建作业处理服务器。我有一个工作人员的池子,它从beanstalkd队列中获取一个任务,并通过使用Process.spawn调用一个执行大量工作的Process.spawn脚本来处理它。

下面是执行PHP命令的方式:

代码语言:javascript
复制
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是异步的):

代码语言:javascript
复制
output = `#{cmd}`
pid = $?.pid
exit_status = $?.exitstatus

到目前为止,这是没有问题的。后背的使用有何不同?

EN

回答 1

Stack Overflow用户

发布于 2013-05-23 12:10:23

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

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

使用了一些细胞,我不认为这与你的问题有关。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16187451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档