Node.js 终止产生进程的进程

Node.js 终止产生进程的进程,node.js,process,electron,Node.js,Process,Electron,我无法停止生成子进程的node.js进程。如果我从终端运行.js进程,我可以使用Ctrl+C停止它。但是如果我从NodeJS应用程序生成它,我不能使用kill(“SIGINT”)杀死它——它只是继续运行并继续报告stdout 这是设置。我有一个脚本,让我们称它为docker.js,它可以这样做: // docker.js child_process.spawn("docker-compose", ["up", "-d", ...args], { stdio: 'inherit' }); 它会做

我无法停止生成子进程的node.js进程。如果我从终端运行.js进程,我可以使用
Ctrl+C
停止它。但是如果我从NodeJS应用程序生成它,我不能使用
kill(“SIGINT”)
杀死它——它只是继续运行并继续报告
stdout

这是设置。我有一个脚本,让我们称它为
docker.js
,它可以这样做:

// docker.js
child_process.spawn("docker-compose", ["up", "-d", ...args], { stdio: 'inherit' });
它会做很多事情并运行一段时间,有时会运行几分钟

如果我从终端运行
/docker.js
,我可以通过按
Ctrl+C

如果我使用
spawn()
fork()
从不同的NodeJS应用程序(在我的例子中是Electron应用程序)中生成
docker.js

我听的是
stdout
stderr
close

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

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

child.on("close", code => {
  console.log(`child process exited with code ${code}`);
});
一切正常(我看到了预期的输出,并最终在完成后“关闭”),但如果我试图在完成前像这样停止该过程:

child.kill("SIGINT"); // Equivalent to Ctrl+C in terminal
子进程一直在运行,我一直通过
stdout
获得
docker compose
输出

我已经尝试了一段时间,但我不知道如何停止
docker.js
,当它从NodeJS/Electron应用程序作为子进程生成时。我以为Terminal和child.kill(“SIGINT”)中的
Ctrl+C
会有相同的行为,但事实并非如此


有人能解释一下这是怎么回事吗?如何从我的NodeJS应用程序中可靠地杀死这个
docker.js
子进程?

在子进程中尝试类似的方法:

process.on('SIGINT', () => {
  console.log('Received SIGINT');
  process.exit(0);
});

当它从终端运行时退出时,为什么有必要这样做?NodeJS进程在TTY中的行为是否不同?我试过这个。它确实允许退出
docker.js
进程(但我的问题仍然是,当不需要从CLI退出时,为什么需要退出),但子
docker compose
进程一直在运行。我在docker之外遇到过这个问题。在Node.js中使用子流程时。我认为这里的主要区别在于处理过程——如果是子过程——处理的是您的nodejs脚本,如果您从CLI启动——这是一些操作系统过程。
process.on('SIGINT', () => {
  console.log('Received SIGINT');
  process.exit(0);
});