处理子进程启动
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
。否则,子进程会在父进程退出时退出。
defunct
在ps
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."
我正在使用 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
。否则,子进程会在父进程退出时退出。
defunct
在ps
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."