簡體   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