在Windows中优雅地杀死一个分离的node.js衍生的subprocess

不是这样的重复:我可以杀死进程罚款,我想知道如何检测,在这个过程中,它被杀死,并正常关机。

概述:

我有一个CLI工具来产生和杀死一个孩子node.js过程。 演示代码包含在这三个文件中:

spawn.js – 将产生child.js脚本,分离。 为了简单起见,我将孩子的stdio传递给out.log文件

child.js – 写入文件的简单计数器, 使用readline方法在Windows中检测仿真的SIGINT

kill.js – 使用它的PID在subprocess上调用process.kill()


码:

spawn.js

 'use strict'; var spawn = require('child_process').spawn; var fs = require('fs'); var path = require('path'); var childFilePath = path.resolve(__dirname, 'child.js'); var out = fs.openSync('./out.log', 'a'); var err = fs.openSync('./out.log', 'a'); var options = { detached: true, stdio: ['ignore', out, err], }; var child = spawn(process.execPath, [childFilePath], options); child.unref(); 

child.js

 'use strict'; var fs = require('fs'); var path = require('path'); if (process.platform === 'win32') { console.log('win32 true'); var rl = require('readline').createInterface({ input: process.stdin, output: process.stdout, }); rl.on('SIGINT', function() { process.emit('SIGINT'); }); } process.on('SIGINT', function() { console.log('SIGINT'); process.exit(); }); var filepath = path.resolve(__dirname, 'pid.txt'); fs.writeFile(filepath, process.pid); var i = 0; setInterval(function () { console.log(i++); }, 1000); 

kill.js

 'use strict'; var fs = require('fs'); var path = require('path'); var pidPath = path.resolve(__dirname, 'pid.txt'); fs.readFile(pidPath, 'utf8', function (err, data) { if (err) { return console.log(err); } process.kill(data, 'SIGINT'); }); 

问题:

当发送process.kill(PID, 'SIGINT') ,它实际上并没有在Windows中将它检测为一个SIGINT 。 我可以手动运行child.js并使用CTRL+Cchild.js进程来触发一个SIGINT ,所以我知道readline代码正在工作(也许不是,因为SIGINT会触发没有readline代码,但它会触发一个SIGINT

process.kill()是否不将信号types发送到分离的进程? 我如何检测到一个单独的脚本试图杀死我的subprocess并正常关机?