2011-01-10 3 views
3

Grüße alle,tail -f nicht in der Schale zu funktionieren scheint, wenn die Datei durch file.write bevölkert wird()

Ich versuche, ein Python-Skript daemonize, die derzeit im Vordergrund läuft. Allerdings muss ich immer noch in der Lage sein, seine Ausgabe zu sehen, die es derzeit auf stdout ablegt.

Also verwende ich das folgende Stück Code, der einen eindeutigen Dateinamen in/tmp erzeugt und dann sys.stdout dieser neuen Datei zuweist. Alle nachfolgenden Aufrufe von 'Drucken' werden dann in diese Protokolldatei umgeleitet.

import uuid 
outfile = open('/tmp/outfile-' + str(uuid.uuid4()), 'w') 
outfile.write("Log file for daemon script...\n") 
sys.stdout=outfile 

# Rest of script uses print statements to dump information into the /tmp file 
. 
. 
. 

Das Problem, das ich bin vor ist, dass, wenn ich die Datei in/tmp erstellt tail -f, ich keine Ausgabe sehen. Sobald ich jedoch meinen Daemon-Prozess beendet habe, ist die Ausgabe in der/tmp-Logdatei sichtbar, weil Python die Dateidaten wegspült.

Ich möchte die/tmp Log-Datei in Echtzeit überwachen, daher wäre es toll, wenn irgendwie die Ausgabe in Echtzeit sichtbar gemacht werden kann.

Eine Lösung, die ich ausprobiert habe, war der Versuch, unbuffered IO zu verwenden, aber das half auch nicht.

Jede Hilfe würde sehr geschätzt werden!

Danke und Gruß, Warpkern

+0

ist sys.stdout.flush() arbeiten? – sjr

+0

flush() kann nicht mit umadressierten stdout helfen – hplbsh

+0

@Stuart, wie bist du zu dieser Schlussfolgerung gekommen? – sjr

Antwort

4

härter Versuchen ungepufferte E/A zu verwenden. Das Problem ist fast sicher, dass Ihre Ausgabe gepuffert ist.

Öffnen der Datei wie folgt funktionieren sollte:

outfile = open(name, 'w', 0) 
+0

Vielen Dank für Ihre Antwort! Ich habe es versucht und es hat funktioniert. Die Verwendung von 'python -u' funktionierte jedoch nicht für ungepufferte E/A. Daher war ich mir nicht sicher, ob die Verwendung von 0 als Puffergröße innerhalb des Codes funktionieren würde. – Warpcore

Verwandte Themen