Pourquoi ne puis-je pas interrompre (c'est-à-dire kill -2
, paskill -9
) tcpdump
comme indiqué dans ce script? Le script s'exécute, mais tcpdump
ne se termine pas et continue de s'exécuter sur la ligne de commande, même après avoir imprimé une partie de sa sortie.
(Remarque: ce script nécessite Sudo
en raison de tcpdump
et 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
J'ai trouvé une partie de la réponse sur ce post Stack Overflow .
Pour résumer, tcpdump
mettait sa sortie en mémoire tampon avant d'écrire dans le fichier de sortie, ce qui posait problème lorsque le script tentait de l'interrompre. L'ajout de l'option -U
("flush") à tcpdump
résout ce problème.
Il fallait également une commande sleep
immédiatement après avoir lancé tcpdump
pour lui permettre de s'initialiser, et également avant de le tuer, pour lui permettre d'écrire dans le fichier:
#!/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
Pour référence, à partir de man tcpdump
, sous l'option -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.
Après cela, le script a bien fonctionné.