时间:2015-05-13 16:14:50

标签: node.js process spawn

我正在使用spawn来创建子进程。我想创建一个子进程,在启动之后我要退出当前进程。

var Spawn = require("child_process").spawn;

var sp = Spawn("sleep", ["10000"]);        
sp.unref();                                

process.exit();                            

上面的代码运行正常:它会创建一个子进程(sleep),它将活10秒并退出当前进程。

我可以确定当process.exit() sleep进程处于活动状态时,或者通过结束父进程,子进程也将被终止吗?

这是一个简单的例子,process.exit()是无用的,因为无论如何这个过程都会结束,因为我打电话给unref。但是,这只是一个例子。

那么,是否有任何事件可以收听来自sp(子进程)的事件,它告诉我嘿我活跃

在某些情况下(例如var sp = Spawn("node", ["foo", "--bar"]);),我会在[nodejs] <defunct>的输出中看到ps aux | grep node,就在产生调用之后。这种情况发生在我可以控制应用程序运行的调试模式中。这意味着这个过程还没有激活,我想。

1 个答案:

答案 0 :(得分:2)

查看io.js来源,child_process.spawn()调用ChildProcess.spawn(),仅在发生所有错误检查后才设置.pid属性。因此,您可以做的一件事是检查是否在pid返回的对象上设置了spawn()属性,如果是,则可以确保您的子进程已成功启动。

(最好仔细查看所有错误的传播方式并处理它们而不是依赖pid。或许pid完全可靠,因为你不能拥有pid没有流程?知道更多的人想要评论或直接编辑这个答案来改进吗?)

如果您希望在代码退出后子进程继续运行,则需要设置options.detached。否则,子进程将在父进程退出时退出。

ps man page

中解释了

defunct

  

标记的进程是死进程(所谓的“僵尸”)   仍然是因为他们的父母没有正确地摧毁他们。这些   如果父进程退出,init(8)将销毁进程。“