杀死产生进程的进程

时间:2017-07-14 14:43:59

标签: 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' });

docker-compose up command做了很多事情并且运行了一段时间,有时持续了几分钟。

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

如果我使用docker.jsspawn()内部生成fork()其他 NodeJS应用(在我的情况下是电子应用):

// DockerApp.js

const dir = `path/to/dockerjs/file/`;

// Tried this with and without `detached: true`
const child = spawn("node", [`./docker.js`, ...args], { cwd: dir, env, detached: true });

// Also tried this, which uses Electron's packaged node process
const child = fork(`./docker.js`, args, { cwd: dir, env, silent: true });

我会倾听stdoutstderr以及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

子进程一直在运行,我通过docker-compose继续获得stdout输出。

我已经尝试了一段时间,但是当我从NodeJS / Electron应用程序中生成子进程时,我无法弄清楚如何停止docker.js。我认为来自终端的Ctrl+Cchild.kill("SIGINT")会有相同的行为,但事实并非如此。

任何人都可以解释这里发生了什么吗?如何从我的NodeJS应用程序中可靠地终止这个docker.js子进程?

1 个答案:

答案 0 :(得分:0)

在子进程中尝试这样的事情:

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