2016-10-19 3 views
4

Ich habe einen Python-Skript Netzwerkverkehr mit tcpdumb in einem Teilprozess zu erfassen:Python mit tcpdump in einem Subprozess: Wie Subprozess richtig zu schließen?

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

Wenn dieses Skript komplette Arbeit, ich versuche Ausgabe .pcap Datei in Wireshark zu öffnen und immer diese Fehler:
"Die Capture-Datei scheint in der Mitte eines Pakets abgeschnitten worden zu sein."

Welche Lösung könnte für das "richtige" Schließen des tcpdumb-Subprozesses angewendet werden?

+0

'p.wait()' sollte warten, bis der Prozess abgeschlossen ist. Ich denke dann, dass der Prozess "geschlossen" ist? – roganjosh

+1

In meinem Fall ist es "unendlich" Prozess (bis Benutzer oder Timer es nicht schließen) – olptkn

+0

Verwenden Sie 'p.kill()' in Ihrem Programm oder unterbrechen Sie auf andere Weise? – tijko

Antwort

3

Statt p.kill() können Sie p.send_signal (subprocess.signal.SIGTERM) verwenden, um ein Signal beenden zu senden, anstatt einen kill (p.terminate() macht das gleiche)

Die Popen docs Beschreiben Sie den Befehl send_signal(). Die Dokumentation zu Signalen ist ein bisschen schwach, aber ein Verzeichnis (subprocess.signal) listet alle Signale auf, die Sie an den Prozess senden können, aber das Beenden sollte einige Zeit für die Bereinigung lassen.

2

Gefunden funktionierende Lösung:
Ich habe p.kill() zu p.terminate() geändert.
Nach dieser Änderung ist der Unterprozess "richtig" beendet (Ausgabe des tcpdump-Subprozesses mit in der Konsole verfügbaren Statistiken) und die ausgegebene .pcap-Datei ist nicht beschädigt.

0

Ich hatte das gleiche Problem beim Schließen von Teilprozessen. Dieser Thread hat wirklich geholfen, also danke, vor allem an https://stackoverflow.com/users/3583715/rkh. Meine Lösung:

Vorher:

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

Nachdem die Popen docs lesen:

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

Aus irgendeinem Grund ruft output.kill() und/oder output.terminate() oder das Senden output.send_signal (subprocess.signal.SIGTERM) hat nicht funktioniert, aber output.TerminateProcess() hat es getan.