2017-11-08 5 views
1

私は、背景のPython 3.5プロセスに書き込まれているファイルを持っています。ファイルはこのプロセス(基本的には実行中のPythonスクリプト)で開かれましたが、ファイルのクローズ文を含めて、そのスクリプトの中で時折バッファをフラッシュしませんでした。手動で終了しない限り、スクリプトは無限になり、私は(今)、Pythonプロセスを強制終了すると、バッファ内のすべてのデータが失われることがわかります。この実行中のプロセスに書き込まれるデータを回復するにはどうしますか?file.close()文を使用せずにPythonプロセスを実行しているときにファイル書き込みバッファをフラッシュする方法はありますか?

答えて

2

1、例です)

pgrep python 

2あなたのpythonのプロセスのPIDを取得します。)リストのファイルディスクリプタ

ls -l /proc/{PID}/fd 

3)オープンGDB

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

4)ファイルを確認してください

+0

ファイルディスクリプタは数字か名前(ディレクトリ)? – Omnomnious

+0

ファイル記述子は数字です。規格FDは、標準偏差は0、標準偏差は1、標準偏差は2です。 – lcastillov

+0

私はこれを得た: プログラム受信信号SIGSEGV、セグメンテーションフォールト。 fflush()内の/lib64/libc.so.6の0x00007f487134d93d デバッグ中のプログラムは、GDBから呼び出された関数中に通知されました。 GDBは、信号が受信されたフレームに残ります。 この動作を変更するには、 "set unwindonsignal on"を使用します。 関数 (fflush)を含む式の評価は中止されます。 – Omnomnious

0

As per the docs

最初f.flush()を行い、その後os.fsync(f.fileno())を行い、Fに関連付けられているすべての内部バッファがディスクに書き込まれることを保証します。ここで

import os 

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

申し訳ありませんが、私は十分ではありませんでした。プロセスはすでに実行されており、この実行プロセスから回復したいと考えています。 – Omnomnious

+0

Ah。それはより困難です。あなたはおそらくgdbを使う必要があるでしょう...私は思い出させるためにここに残しておきたいと思います - プログラムをやめた後、これを忘れたくはありません:P – Shadow

関連する問題