gpt4 book ai didi

node.js - 无法杀死 Windows 上的子进程

转载 作者:IT老高 更新时间:2023-10-28 23:18:27 27 4
gpt4 key购买 nike

以下永远不会退出

var child_process = require('child_process');

var ps = child_process.spawn('.\\node_modules\\.bin\\babel.cmd', ['input.js', '--out-file', 'output.js', '--watch']);

ps.on('exit', function() {
console.log('exit');
});

ps.on('close', function() {
console.log('close');
});

setTimeout(function () {
ps.kill();
}, 2000);

这里发生了什么?还有什么是正确的做法?使这个进程真正关闭的唯一方法是杀死父进程。我怀疑它正在等待 stdio 刷新或类似的东西?

如果给它一个 'ignore' 标准输出配置,它确实会死掉,但我需要流。

var ps = child_process.spawn('.\\node_modules\\.bin\\babel.cmd', ['test.js', '--out-file', 'output.js', '--watch'], {
stdio: 'ignore'
});

最佳答案

您正在使用 babel.cmd 生成子进程 cmd.exe。这个进程然后启动另一个孙进程 node 并运行 babel 脚本。当您执行 ps.kill() 时,它只会杀死 cmd.exe 而不会杀死它创建的子进程。

虽然cmd.exe被关闭了,但是父进程的stdio流仍然与树中的其他进程共享。所以父进程正在等待流被关闭。使用 stdio: 'ignore' 只会停止与树中的其他进程共享 stdio 流,但这些孙进程仍将继续运行。


更新:

在与 OP 讨论后,我测试了所有三个 stdio 选项:pipe(默认)、inheritignore in iojs 3.3.0 ,Windows 7(32 位)。 它们都不会杀死孙进程

使用 inheritignore,父进程和子进程 (cmd.exe) 都被杀死,但大子进程仍然 float 并且不属于任何进程进程树。

使用pipe,只有子进程被终止,但父进程和大子进程都继续运行。父进程未退出的原因很可能是因为父 node.exe 的 stdio 仍与原始答案中提到的其他进程共享。

child.unref() 对杀死大子进程没有任何影响。它只是将子进程从父进程的事件循环中移除,这样父进程才能正常退出。


我可以想到几个解决方案:

  1. 直接调用 babel.js 而不用那个 cmd 脚本:

    var ps = child_process.spawn('node', ['.\\node_modules\\babel\\bin\\babel.js', 'input.js', '--out-file', 'output.js', '--watch'])
  2. 使用带有 \T 标志的 windows taskkill 命令杀死进程及其启动的所有子进程:

    os = require('os');
    if(os.platform() === 'win32'){
    child_process.exec('taskkill /pid ' + ps.pid + ' /T /F')
    }else{
    ps.kill();
    }

    有一些 npm 模块可以处理 Unix 和 Windows 中的杀死子进程,例如tree-kill .对于 Windows,它使用 taskkilltasklist

关于node.js - 无法杀死 Windows 上的子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32705857/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com