【问题标题】:Killing a process that spawned a process杀死产生进程的进程
【发布时间】:2017-07-14 14:43:59
【问题描述】:

我无法停止生成子进程的 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 持续突破。

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

// 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 });

我听stdoutstderrclose

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的输出。

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

谁能解释这里发生了什么?我怎样才能可靠地从我的 NodeJS 应用程序中杀死这个 docker.js 子进程?

【问题讨论】:

    标签: node.js process electron


    【解决方案1】:

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

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

    【讨论】:

    • 从终端运行时退出时为什么需要这样做? NodeJS 进程在 TTY 中的行为是否不同?
    • 我试过这个。它确实允许docker.js 进程退出(但我的问题仍然是为什么从CLI 不需要它时需要它),但子docker-compose 进程继续运行。
    • 我在 docker 之外遇到过这个问题。在 Node.js 中使用子进程时。我认为这里的主要区别是处理过程——如果是子进程——处理的是你的 nodejs 脚本,如果你从 CLI 启动——它是一些操作系统进程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    相关资源
    最近更新 更多