Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 节点是否自动杀死生成的子进程?_Node.js_Windows_Spawn_Kill Process - Fatal编程技术网

Node.js 节点是否自动杀死生成的子进程?

Node.js 节点是否自动杀死生成的子进程?,node.js,windows,spawn,kill-process,Node.js,Windows,Spawn,Kill Process,在的文档中,child\u process.spawn()一节中有这样一句话: 在Windows上,将options.detached设置为true可使 父进程退出后继续运行的子进程 这使它听起来像(至少在Windows上)当您离开选项时。将分离为默认值false,spawn()'d进程将自动终止。这实际上是我在应用程序中想要的行为,事实上,我在代码中调用了myChildProcess.kill(“SIGINT”),但注释掉了,当我的应用程序退出时,子进程仍然消失了。这很好,但是: (1) 我的

在的文档中,
child\u process.spawn()
一节中有这样一句话:

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

这使它听起来像(至少在Windows上)当您离开
选项时。将
分离为默认值
false
spawn()
'd进程将自动终止。这实际上是我在应用程序中想要的行为,事实上,我在代码中调用了
myChildProcess.kill(“SIGINT”)
,但注释掉了,当我的应用程序退出时,子进程仍然消失了。这很好,但是:

(1) 我的理解是,为了在Windows上工作,有必要对“作业对象”进行一些棘手的处理。您知道Node是否正在做一些像这样的棘手的事情,以使子进程消失吗?或者可能比这更简单,Node只保留一个生成的进程ID列表,并在关闭时杀死任何仍然存在的进程ID?这就引出了一个密切相关的问题

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


更新:澄清一下,我在本例中启动的子进程是Python web服务器进程,而不是其他节点进程。就这个问题而言,我不知道节点子进程和其他子进程之间的行为是否有差异。

只要事件队列中没有剩余内容(并且没有挂起的异步代码),节点实例就会退出,因此,只要您没有留下任何打开的内容,那么节点进程自然会在完成后退出


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

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

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

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


对于节点子进程来说,一个很好的做法是:尽可能让它们完成分配的任务,然后退出。换句话说,在大多数情况下,您不需要依赖此子/分离行为。

您可以通过cmd生成-不一定是节点实例我问的是子进程,而不是主节点进程本身。@MKatz但是您不是在生成其他节点实例吗?这就是我从你那里学到的question@Estradiaz是的,不过我是基于OP是繁殖节点的问题来假设的instances@James,不,抱歉,这些不是我正在生成的其他节点实例。我会在帖子里更新的。但是,即使它们是其他节点实例,它们也可以永远运行进程,对吗?因此,仍然有一个问题是,父母辞职是否会自动杀死他们。我不相信这是真的,至少在Windows上是这样。如果你看一看原始帖子中的“让步”(1)中的链接,你会发现所有的问题都是想找出一种方法,当父进程死亡/崩溃时,让子进程被杀死,不是吗?(父进程崩溃的情况是主要情况,因为显然父进程可以在正常终止时在其运行结束时显式地杀死子进程。)至于子进程是否应该完成其工作,然后退出,这取决于子进程的性质。有时他们有一个有限的工作要做。在我的例子中,子进程是PythonWeb服务器,它们为来自我的Electron客户端(主节点应用程序)的各种ajax调用提供服务。因此,这些子进程一直在进行,直到有人告诉他们退出或杀死他们。