Can't kill child process on Windows

后端 未结 4 1819
暗喜
暗喜 2021-01-11 20:24

The following will never exit

var child_process = require(\'child_process\');

var ps = child_process.spawn(\'.\\\\node_modules\\\\.bin\\\\babel.cmd\', [\'in         


        
4条回答
  •  暖寄归人
    2021-01-11 21:13

    I have the same issue on Windows (Win 10 64x). I can't terminate a process of a spawned child process.

    I start a service (custom HTTP server service.windows) using child_process.spawn():

    const { spawn } = require('child_process');
    let cp = spawn('"C:\\Users\\user\\app\\service.windows"', [], { shell: true,  });
    
    cp.stderr.on('data', (data) => {
        console.log(`stderr: ${data}`);
        console.log('cp.connected', cp.connected);
        console.log('process.pid', process.pid); // 6632 <<= main node.js PID
        console.log('cp.pid', cp.pid); // 9424 <<= child PID
    
        // All these are useless, they just kill `cp`
        cp.kill('SIGINT'); // Doesn't terminate service.windows
        cp.kill('SIGKILL'); // Doesn't terminate service.windows
        cp.kill('SIGTERM'); // Doesn't terminate service.windows
    });
    

    And I want to terminate my HTTP server service (service.windows). And it is not possible on Windows using cp.kill('ANY SIGNAL'). Node.js kills its child process (cp) but my HTTP server (service.windows) still runs fine.

    When I check it in other terminal, I see my server is running just fine:

    $ netstat -ano | findstr :9090
      TCP    0.0.0.0:9090           0.0.0.0:0              LISTENING       1340
      TCP    [::]:9090              [::]:0                 LISTENING       1340
    

    I try manually kill my server by PID but with T flag, not F. The difference:

    T terminate all child processes along with the parent process, commonly known as a tree kill.

    F process(es) be forcefully terminated.

    $ taskkill -T -PID 1340
    ERROR: The process with PID 1340 (child process of PID 9424) could not be terminated.
    Reason: This process can only be terminated forcefully (with /F option).
    

    And it exactly says that my server 1340 is a child of that cp - PID 9424.

    OK, I try to terminate that cp using T flag again. And boom, not possible. cp is a child of my main node.js process.pid 6632:

    $ taskkill -T -PID 9424
    ERROR: The process with PID 1340 (child process of PID 9424) could not be terminated.
    Reason: This process can only be terminated forcefully (with /F option).
    ERROR: The process with PID 9424 (child process of PID 6632) could not be terminated.
    Reason: One or more child processes of this process were still running.
    

    I can only kill it forcefully with F flag:

    $ taskkill -F -T -PID 9424
    SUCCESS: The process with PID 1340 (child process of PID 9424) has been terminated.
    SUCCESS: The process with PID 9424 (child process of PID 6632) has been terminated.
    

    Most disappointing thing is that Node.js docs doesn't say jack ship about how to deal with this issue. They only say "yes, we know the issue exist and we just inform you about it".

    The only option I see on Windows is to use taskkill -F -T -PID 9424 in spawned process:

    exec('taskkill -F -T -PID 9424');
    

提交回复
热议问题