【问题标题】:NodeJS Kill Forever Running Child ProcessNodeJS杀死永远运行的子进程
【发布时间】:2019-09-10 14:22:41
【问题描述】:

我正在使用 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');

它们似乎都没有工作。这是完全实现最终数据包然后优雅关闭的最佳方式。

【问题讨论】:

    标签: node.js process wireshark tshark


    【解决方案1】:

    鲨鱼的性质

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

    可能的解决方案

    如果您绝对需要用户点击终止按钮时传入的数据包,为什么不在收到信号后等待 100 毫秒然后终止呢?这将捕获有问题的数据包,并且不会被用户注意到。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-30
        • 2017-08-15
        • 2018-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多