繁体   English   中英

NodeJS永远杀死正在运行的子进程

[英]NodeJS Kill Forever Running Child Process

我正在使用Wireshark的Tshark cmd工具捕获一些网络数据包并进行分析。 为了生成工作环境,您只需要Wireshark 3+和NodeJS 9+。 我正在使用以下代码在特定时间剪切Tshark流(setTimeout用于模拟用户同时单击“停止”按钮)

var spawn = require('child_process').spawn,
ts = spawn('tshark', ['-i', 'Wi-Fi', '-T', 'json']);

function analyzePacket(packet) {
    console.log(packet.toString());
}

ts.stdout.on('data', function (packet) {
    analyzePacket(packet)
});

setTimeout(function(){ ts.kill(); }, 5000);

但是,当ts.kill();时,这很好用ts.kill(); 被调用时,将包信息写入屏幕的中间被剪切。 我希望tshark完全输出在单击停止按钮(触发ts.kill())之前捕获的最后一个数据包。 据我所知,我尝试发送不同类型的信号,这些信号的杀伤性不同。 以下是:

ts.kill('SIGINT');
ts.kill('SIGHUP');
ts.kill('SIGKILL');

他们似乎都没有工作。 这是完全获得最终数据包,然后正常关闭的最佳方法。

沙扎克的性质

tshark在捕获时将始终处于解析数据包的中间。 您实际上没有办法要求它在杀死它之前完成对数据包的解析。 如果希望它在某个条件后正常退出,则-a duration:NUM将在NUM秒后停止,而-c NUM将在NUM个数据包后停止。

可能的解决方案

如果您绝对需要用户按下“停止”按钮时进入的数据包,为什么不等收到信号后等待100毫秒再杀死呢? 这将捕获有问题的数据包,并且不会被用户注意到。

创建一个函数并在接收到数据时调用该函数,而不是在setTimeout中终止进程。

function killPocess(){
  ts.kill();
}
function analyzePacket(packet) {
    console.log(packet.toString());
   killPocess(); // kill the process as packet is received
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM