Почему я не могу прервать (т.е. kill -2
, нет kill -9
) tcpdump
как показано в этом сценарии? Выполнения сценария, но tcpdump
не завершается и продолжает работать в командной строке, даже после печати части ее вывода выхода.
(Примечание: этот сценарий требует sudo
из-за tcpdump
и kill
).
#!/bin/bash
#start a process in the background (it happens to be a TCP HTTP sniffer on the loopback interface, for my apache server):
tcpdump -i lo -w dump.pcap 'port 80' &
#.....other commands that send packets to tcpdump.....
#now interrupt the process. get its PID:
pid=$(ps -e | pgrep tcpdump)
echo $pid
#interrupt it:
kill -2 $pid
Я нашел часть ответа на этом сообщении Переполнения стека .
подводя итоги, tcpdump
буферизовал его вывод прежде, чем записать в выходной файл, и это вызвало проблемы, когда сценарий попытался прервать его. При добавлении -U
("сброс") опция к tcpdump
фиксирует это.
Также необходимый были sleep
команда сразу после издания tcpdump
, чтобы позволить этому инициализировать, и также прежде, чем уничтожить его, позволить ему писать в файл:
#!/bin/bash
#start a process in the background (it happens to be a TCP HTTP sniffer on the loopback interface, for my apache server):
tcpdump -U -i lo -w dump.pcap 'port 80' &
sleep 5
#.....other commands that send packets to tcpdump.....
#now interrupt the process. get its PID:
pid=$(ps -e | pgrep tcpdump)
echo $pid
#interrupt it:
sleep 5
kill -2 $pid
Для ссылки, от man tcpdump
, под -U
опция:
If the -w option is specified, make the saved raw packet output ``packet-buffered''; i.e., as each packet is saved, it will be written to the output file, rather than being written only when the output buffer fills.
После этого сценарий хорошо работал.
Можно ввести команду ниже:
killall tcpdump
Это релевантно, если Вы имели непрерывное выполнение tcpdump и хотели закончить тот процесс. Ничто иное не затронуто.