2015-05-13 113 views
0

我使用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"]);),我在ps aux | grep node的输出中看到[nodejs] <defunct>,就在产卵呼叫之后。这发生在我可以控制应用程序运行的调试模式中。这意味着这个过程还没有活跃,我想。

+0

信号是你的朋友。 –

回答

2

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

(这可能是更好的在所有的错误是如何传播回仔细观察和处理,而不是依靠pid他们。也许pid是完全可靠的,因为你不能有一个pid没有过程?有人谁知道更多想要评论或直接编辑此答案以改进它?)

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

defunctps man page解释:标

进程是死的过程(所谓的“僵尸”) 仍然存在,因为他们的父母没有正确地销毁了它们。这些 过程会由init被破坏(8)如果父进程退出。”

+0

如果我能运行'child_process.spawn()'然后后立即检查孩子进程的PID这是否意味着进程启动是同步和阻塞的?如果对'spawn'返回的对象设置了pid,并且未设置它,例如,如果找不到该命令,则在搜索PATH时spawn必须被阻塞,文件系统被访问等。这是正确的吗? – rsp