【问题标题】:Unknown signal error as I try to kill a process尝试终止进程时出现未知信号错误
【发布时间】:2018-01-17 12:32:08
【问题描述】:

我正在尝试使用child_process 中的kill 方法杀死一个进程。但是当我尝试调用该函数时出现以下错误:

TypeError [ERR_UNKNOWN_SIGNAL]: Unknown signal: 18408

我的做法如下:

    const ls = spawn('node',['print']);

    ls.stdout.on('data', (data) => {
    console.log(`stdout: ${data}`);
    });

    ls.stderr.on('data', (data) => {
    console.log(`stderr: ${data}`);
    });

    ls.on('close', (code) => {
    console.log(`child process exited with code ${code}`);
    });


    setTimeout(() => {
            ls.kill(ls.pid);
    },4000);

这可能是什么原因?我错过了什么?

【问题讨论】:

    标签: node.js shell spawn


    【解决方案1】:

    kill() 发送一个 Unix 信号。这些用数字表示。您应该将信号编号传递给 kill(),而不是 PID。

    试试

    import signal
    print(signal.SIGTERM)
    

    这可能会打印15,这是信号 TERM 的编号(通常会终止它被发送到的进程)。

    在你的程序中你可以调用

    ls.kill(signal.SIGTERM)
    

    【讨论】:

    • 没错。我不喜欢 node.js,只被 shell 标签引导阅读这个 Q。我什至没有注意到这里使用的语言,但问题是显而易见的。有关正确 node.js 语法的更多信息,请参阅其他答案。
    【解决方案2】:

    事实上,与 Linux kill() 命令不同,它将进程 pid 和信号作为参数,Nodejs ChildProcess subprocess.kill() 只需要信号参数(根据文档)。

    subprocess.kill([signal])

    这是有道理的,因为子进程已经知道它的 pid(你在使用 subprocess.pid 时得到的那个),所以你不需要再次提供它。

    要终止您的进程,您可以将有效信号传递给.kill() 方法:

    ls.kill('SIGTERM');
    

    或者,您也可以简单地调用子进程的.kill() 方法而不带任何参数,这相当于使用“SIGTERM”信号调用它。

    ls.kill() 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 2018-09-27
      • 2014-06-19
      • 2013-02-14
      相关资源
      最近更新 更多