我正在使用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
,就在产生调用之后。这种情况发生在我可以控制应用程序运行的调试模式中。这意味着这个过程还没有激活,我想。
答案 0 :(得分:2)
查看io.js
来源,child_process.spawn()
调用ChildProcess.spawn()
,仅在发生所有错误检查后才设置.pid
属性。因此,您可以做的一件事是检查是否在pid
返回的对象上设置了spawn()
属性,如果是,则可以确保您的子进程已成功启动。
(最好仔细查看所有错误的传播方式并处理它们而不是依赖pid
。或许pid
完全可靠,因为你不能拥有pid
没有流程?知道更多的人想要评论或直接编辑这个答案来改进吗?)
如果您希望在代码退出后子进程继续运行,则需要设置options.detached
。否则,子进程将在父进程退出时退出。
ps
man page:中解释了 defunct
标记的进程是死进程(所谓的“僵尸”) 仍然是因为他们的父母没有正确地摧毁他们。这些 如果父进程退出,init(8)将销毁进程。“