在Node中杀死独立的子进程

问题描述

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

服务器(子进程)

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

解决方法

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
,

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

基于此行为,看来您的操作系统是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上尝试过。)