【问题标题】:Kill detached child process in Node在 Node 中杀死分离的子进程
【发布时间】:2020-08-18 14:03:40
【问题描述】:

我不完全明白为什么我不能杀死一个分离的进程。有人可以帮帮我吗?

服务器(子进程)

const server = spawn(
    'npm',
    [
        'run',
        'watch:be',
    ],
    {
        detached: true,
    },
);

等待服务器启动并运行

await waitOn({
    resources: [
        `https://localhost:${process.env.SERVER_PORT}`,
    ],
    delay: 1000,
    timeout: 30000,
});
console.log('server is up and running');

再等几秒钟

await new Promise((resolve, reject): void => {
    setTimeout((): void => {
        resolve();
    }, 2000);
});
console.log('Run test');

杀死子服务器

server.kill();
console.log('Shutdown server');

所有这些都在同一个文件中。

子进程打开了一个新的终端窗口(当它打开时spawn,这是预期的),但在kill 时没有关闭。谁能指出我做错了什么?

【问题讨论】:

    标签: node.js child-process


    【解决方案1】:
    server.kill();
    

    根据 node.js 文档,subprocess.kill() 方法向子进程发送信号。当您使用detached 选项时,节点会为子进程创建一个单独的进程组,并且它不再属于同一进程。

    detached <boolean>: Prepare child to run independently of its parent process
    

    这就是使用detached时不适合使用kill的原因。

    这里已经讨论过: https://github.com/nodejs/node/issues/2098

    正如上面链接中的建议,您应该使用process.kill 来终止进程(https://nodejs.org/api/process.html#process_process_kill_pid_signal)。这应该对你有用:

    process.kill(-server.pid)
    
    

    【讨论】:

    • 如果我使用process.kill(-server.pid);,这将显示Error: kill ESRCH :(
    • 你能创建一个小的示例代码以便检查吗?
    • 如果上述方法不适合您,请尝试不使用否定:process.kill(server.pid)。负数是针对流程组的,而不是针对单个流程的。
    • @manishg 我遇到了同样的错误Error: kill ESRCH,但我使用的是 Windows。
    【解决方案2】:

    你说“子进程打开了一个新的终端窗口……”

    根据这种行为,您的操作系统似乎是 Windows。

    在 Windows 上,将 options.detached 设置为 true 可以让子进程在父进程退出后继续运行。孩子将拥有自己的控制台窗口。一旦为子进程启用,它就不能被禁用。

    source

    对于process.kill,第二个参数是您要发送的信号。默认情况下,此信号为SIGTERM。但是,根据 Node.js 文档的 Signal Events 部分,Windows 似乎不支持 SIGTERM

    • Windows 不支持'SIGTERM',可以收听。

    不妨试试

    process.kill(server.pid, 'SIGHUP')
    

    process.kill(server.pid, 'SIGINT')
    

    (这适用于 macOS,但我没有在 Windows 上尝试过。)

    【讨论】:

    • 刚刚在 Windows 上尝试了这两种方法。好像不行
    猜你喜欢
    • 2016-03-05
    • 1970-01-01
    • 2010-12-08
    • 2019-06-14
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多