首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NodeJS终止永远运行的子进程

NodeJS终止永远运行的子进程
EN

Stack Overflow用户
提问于 2019-09-10 22:22:41
回答 2查看 48关注 0票数 0

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

代码语言:javascript
运行
复制
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())之前捕获的最后一个数据包。我试着发送了不同的信号,据我所知,不同的信号在杀死的严酷程度上有所不同。如下所示:

代码语言:javascript
运行
复制
ts.kill('SIGINT');
ts.kill('SIGHUP');
ts.kill('SIGKILL');

它们似乎都不起作用。这是实现最终数据包完全,然后优雅地关闭的最好方法。

EN

回答 2

Stack Overflow用户

发布于 2019-09-11 11:42:26

Tshark的性质

tshark在捕获数据包时总是处于解析数据包的过程中。对于你来说,没有一种方法可以让它在终止之前完成对数据包的解析。如果您希望它在某个条件后正常退出,-a duration:NUM将在NUM秒后停止,-c NUM将在NUM数据包之后停止。

可能的解决方案

如果您确实需要用户点击kill按钮时到达数据包,为什么不在收到信号后等待100ms,然后kill?这将捕获有问题的数据包,并且不会被用户注意到。

票数 0
EN

Stack Overflow用户

发布于 2019-09-11 13:27:18

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

代码语言:javascript
运行
复制
function killPocess(){
  ts.kill();
}
function analyzePacket(packet) {
    console.log(packet.toString());
   killPocess(); // kill the process as packet is received
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57872867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档