节点会自动杀死生成的子进程吗?

问题描述 投票:1回答:2

Node's Child Processes的文档中,child_process.spawn()的部分中有这句话:

在Windows上,将options.detached设置为true可以使父进程退出后,子进程继续运行。

这听起来像是当您将options.detached保留为默认值false时,spawn()的进程将自动被杀死。那实际上是我想要在应用程序中执行的行为,实际上我在代码中调用了myChildProcess.kill( "SIGINT" ),但是注释掉了,当我的应用程序退出时,子进程仍然消失了。太好了,但是:

((1)我的理解是,有必要对[作业对象]进行一些棘手的工作,如here所讨论,才能在Windows上实现此功能。您是否知道Node是否正在做一些棘手的事情来使子进程消失?还是比这更简单,Node仅保留生成的进程ID的列表,并在关闭时杀死仍然存在的ID?这导致了密切相关的问题...

((2)如果Node确实在做一些特殊的事情来杀死子进程,您是否知道是否有某些情况(例如某种应用程序崩溃)会破坏它正在做的事情并使子进程继续运行?

node.js windows spawn kill-process
2个回答
0
投票

只要事件队列中没有剩余(并且没有等待处理的异步代码),Node实例就会退出,因此,只要您没有打开任何东西,那么当完成时,Node进程自然就会退出。

就崩溃时挂起的进程而言,除非您明确地处理未捕获的异常,否则该进程将立即退出。


0
投票

[如果您希望子进程长时间运行并在节点进程本身终止后继续存在,如您所知,设置为options.detached = true

这种在父进程停止时停止子进程的操作是操作系统的行为。父进程(运行任何编程语言系统,而不仅是节点)都拥有一个非分离的子进程。操作系统在父进程终止时清理子进程。

分离一个进程会告诉操作系统使其不再是子进程,因此操作系统不会自动清除它。

节点子进程的良好做法:尽可能使它们执行分配的任务,然后退出。换句话说,在大多数情况下,您不需要依赖此子行为/超脱行为。

© www.soinside.com 2019 - 2024. All rights reserved.