2015-06-05 80 views
0

的文件我有一個長期運行的Python進程定期轉儲使用恢復長時間運行的Python進程

while True: 
     do_something() 
     pickle.dump(var, open('file','wb')) 

我刪除了「文件」假定它會被改寫反正但該文件已經一去不復返了泡菜。我認爲每次調用open()時,python都會創建一個新的文件處理程序。無論如何恢復這個文件?該進程仍在運行,它仍然會寫入'文件'。

這是一個Ubuntu電腦的方式

+2

你確定腳本沒有掛在別的地方嗎?你應該創建一個新文件是正確的。另外,這個腳本運行了多久,你是否抓住這個代碼的例外?如果腳本已經運行了很長時間,則可能是因爲沒有正確關閉它們而打開了文件描述符上的操作系統限制。 – skrrgwasme

+0

我同意上面的評論,在幾個層面上,劇本可能會掛在別的地方。腳本是否附加到文件中,我認爲這將是'w +',而不是'w'。另外,你應該使用一個上下文管理器來打開你的文件,在這種情況下用''''''''語句。 – dave

+0

要檢查由於不正確關閉而導致文件的多個實例存有不必要的描述符,可以使用「lsof | grep name_of_file」。 – stevieb

回答

0

因爲這是Linux,你應該能夠做到這一點:

1)找到你的Python腳本的PID

ps -ef | grep myscript.py 

2 )查看腳本的打開文件描述符

lsof -p <PID> 

3)標識文件描述符該文件你有興趣 - 它可能說,「(刪除)」在該行

4)結束使該文件

cp /proc/<PID>/fd/<filedes> /some/other/path 

需要注意的是,如果你實際上有用完的副本的文件描述符,您可以用這種方式找到的最新副本可能會很舊,這取決於它更新的頻率以及腳本運行了多長時間。但是,總比沒有好。如果你確實超出了文件描述符的範圍,我認爲open()可能會引發異常。

一個已經提到的是,也許你從來沒有得到的pickle.dump()調用其他的可能性,在這種情況下,上面會不會在所有幫助,因爲不會有恢復任何文件...