Python con tcpdump en un subproceso: ¿cómo cerrar el subproceso correctamente?

Tengo una secuencia de comandos de Python para capturar el tráfico de red con tcpdumb en un subproceso:

p = subprocess.Popen(['tcpdump', '-I', '-i', 'en1', '-w', 'cap.pcap'], stdout=subprocess.PIPE) time.sleep(10) p.kill() 

Cuando este script complete el trabajo, estoy intentando abrir el archivo de salida .pcap en Wireshark y aparece este error:
“El archivo de captura parece haberse cortado en medio de un paquete”.

¿Qué solución podría aplicarse para el cierre “adecuado” del subproceso tcpdumb?

En lugar de p.kill (), puede usar p.send_signal (subprocess.signal.SIGTERM) para enviar una señal de terminación en lugar de un kill (p.terminate () hace lo mismo)

Los documentos de Popen describen el comando send_signal (). La documentación sobre las señales es un poco débil, pero un directorio (subprocess.signal) mostrará una lista de todas las señales que puede enviar al proceso, pero su finalización debería permitirle un tiempo de limpieza.

Solución de trabajo encontrada:
He cambiado p.kill() a p.terminate() .
Después de que este subproceso de cambio haya finalizado “correctamente” (la salida del subproceso tcpdump con estadísticas disponibles en la consola) y la salida del archivo .pcap no esté dañada.

Tuve el mismo problema con el cierre de los subprocesos. Este hilo realmente ayudó, así que gracias, especialmente a https://stackoverflow.com/users/3583715/rkh . Mi solución:

Antes de:

 output = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True) message = output.stdout.read() output.stdout.close() 

Después de leer los documentos de Popen:

 output = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True) message = output.stdout.read() output.TerminateProcess() 

Por alguna razón, llamar a output.kill () y / o output.terminate () o enviar output.send_signal (subprocess.signal.SIGTERM) no funcionó, pero output.TerminateProcess () sí funcionó.