在Node中杀死独立的子进程

时间:2020-08-18 14:03:40

标签: node.js child-process

我不完全理解为什么我不能杀死一个独立的进程。有人可以帮我吗?

服务器(子进程)

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时没有关闭。有人可以指出我做错了什么吗?

2 个答案:

答案 0 :(得分:1)

rdd = sc.textFile("test.csv")
rdd = rdd.map(lambda line: line.replace('\"','').split(','))

def isHeader(row): return 'ID' in str(row)
    
rdd1 = rdd.filter(isHeader)
rdd2 = rdd.filter(lambda x: not(isHeader(x))).map(lambda line: [line[0], line[1], int(line[2]), int(line[3])])

rdd1.union(rdd2).collect()


[['ID', 'Area', 'Postcode', 'Amount'],
 ['1234/232', 'City', 8479, 20000],
 ['5987/215', 'Metro', 1111, 25000]]

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

detached

这就是使用detached <boolean>: Prepare child to run independently of its parent process kill不适合使用的原因。

对此已在此处进行了讨论: https://github.com/nodejs/node/issues/2098

如以上链接中所建议,您应使用detached终止该进程(https://nodejs.org/api/process.html#process_process_kill_pid_signal)。这可能适合您:

process.kill

答案 1 :(得分:0)

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

基于此行为,看来您的操作系统是Windows。

在Windows上,将options.detached设置为true可使子进程在父进程退出后继续运行。该孩子将拥有自己的控制台窗口。为子进程启用后,将无法禁用它。

source

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

    Windows上不支持
  • 'SIGTERM',可以监听它。

也许尝试

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

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

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

相关问题