NodeJS убить навсегда запущенный дочерний процесс

Я использую инструмент Tshark cmd от Wireshark для захвата некоторых сетевых пакетов и их анализа. Для создания рабочей среды вам нужны только 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');

Кажется, ни один из них не работает. Это лучший способ полностью получить окончательный пакет, а затем изящно закрыть его.


person I.K.    schedule 10.09.2019    source источник


Ответы (2)


Природа Царка

tshark всегда будет в процессе разбора пакетов при захвате. На самом деле у вас нет способа попросить его закончить разбор пакета перед его уничтожением. Если вы хотите, чтобы он завершился корректно после выполнения условия, -a duration:NUM остановится через NUM секунд, а -c NUM остановится через NUM пакетов.

Возможное решение

Если вам абсолютно необходим этот пакет, который пришел, когда пользователь нажал кнопку уничтожения, почему бы не подождать 100 мс после получения сигнала, а затем убить? Это захватит рассматриваемый пакет и не будет заметно для пользователя.

person Ross Jacobs    schedule 11.09.2019

Вместо того, чтобы убивать процесс в setTimeout, создайте функцию и вызовите эту функцию при получении данных.

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

person virender nehra    schedule 11.09.2019