2017-11-08 1 views
1

Ich habe eine Datei, in die in einem Python 3.5-Hintergrundprozess geschrieben wird. Die Datei wurde in diesem Prozess geöffnet (was im Grunde ein laufendes Python-Skript ist), aber ich habe vergessen, eine close-Anweisung für die Datei einzufügen, um den Puffer gelegentlich in diesem Skript zu löschen. Das Skript ist unendlich, es sei denn, es wird manuell beendet und ich (jetzt) ​​weiß, dass das Löschen des Python-Prozesses dazu führt, dass alle Daten im Puffer verloren gehen. Gibt es trotzdem eine Wiederherstellung der Daten, die in diesem bereits laufenden Prozess geschrieben werden sollen?Wie speichere ich den Datei-Schreibpuffer im laufenden Python-Prozess ohne file.close() - Anweisung?

Antwort

2

1)

pgrep python 

2) Liste Filedeskriptoren

ls -l /proc/{PID}/fd 

3) Öffnen Sie gdb die PID Ihrer Python-Prozess Get

$ gdb 
(gdb) attach {PID} 
(gdb) call fflush({FILE_DESCRIPTOR}) 
(gdb) detach 

4) Überprüfen Sie Ihre Datei

+0

Ist der Dateideskriptor eine Zahl oder ein Name (mit Verzeichnis)? – Omnomnious

+0

Der Dateideskriptor ist die Nummer. Die Standards FD sind: 0 für stdin, 1 für stdout, 2 für stderr. – lcastillov

+0

Ich landete dabei: Programm empfangen Signal SIGSEGV, Segmentierung Fehler. 0x00007f487134d93d in fflush() von /lib64/libc.so.6 Das zu debuggende Programm wurde während einer von GDB aufgerufenen Funktion signalisiert. GDB bleibt in dem Rahmen, in dem das Signal empfangen wurde. Um dieses Verhalten zu ändern, verwenden Sie "set dewonesignal on". Die Auswertung des Ausdrucks mit der Funktion (fflush) wird abgebrochen. – Omnomnious

0

As per the docs

erste f.flush() tun, und dann tun os.fsync(f.fileno()), dass alle internen Puffer mit f verbunden sind, um sicherzustellen, auf die Festplatte geschrieben werden. Hier

ist ein Beispiel,

import os 

with open("filename", "w") as f: 
    while True: # infinite program 
     f.write("the text") 
     f.flush() 
     os.fsync(f.fileno()) 
+0

Sorry, ich war nicht klar genug. Der Prozess läuft bereits und ich möchte ihn von diesem laufenden Prozess wiederherstellen. – Omnomnious

+0

Ah. Das ist dann schwieriger. Wahrscheinlich wirst du gdb benutzen müssen ... Ich denke, ich werde das hier als Erinnerung hinterlassen - du wirst es nicht vergessen, das zu tun, nachdem du dein Programm beendet hast: P – Shadow

Verwandte Themen