处理子进程启动

Handling the child process starting

我正在使用 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"]);)我在 spawn 调用后立即在 ps aux | grep node 的输出中看到 [nodejs] <defunct>。这发生在我可以控制应用程序的调试模式下 运行。我猜这意味着该过程尚未激活。

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

(仔细观察所有错误是如何传播回来并处理它们而不是依赖 pid 可能更好。或者 pid 可能是完全可靠的,因为你不能有没有流程的pid?有知道的人想发表评论或直接编辑这个答案来改进它吗?)

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

defunctps man page中有解释:

Processes marked are dead processes (so-called "zombies") that remain because their parent has not destroyed them properly. These processes will be destroyed by init(8) if the parent process exits."