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

时间:2019-09-10 14:22:41

标签: node.js process wireshark tshark

我正在使用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();时,在中间切掉了将信息包信息写到屏幕上的情况。我希望tshark完全输出在单击停止按钮(触发ts.kill())之前捕获的最后一个数据包。据我所知,我尝试发送不同类型的信号,这些信号的杀伤性不同。如下:

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

它们似乎都不起作用。这是完全获得最终数据包,然后正常关闭的最佳方法。

2 个答案:

答案 0 :(得分:0)

Tshark的本质

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

可能的解决方案

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

答案 1 :(得分:0)

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

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