恢复长时间运行的python进程的文件

恢复长时间运行的python进程的文件,python,file,pickle,recovery,Python,File,Pickle,Recovery,我有一个长期运行的python进程,它使用 while True: do_something() pickle.dump(var, open('file','wb')) 我删除了“文件”,假设它无论如何都会被重写,但文件永远不见了。我以为每次调用open()时python都会创建一个新的文件处理程序。是否仍有恢复此文件的方法?进程仍在运行,它仍将写入“文件” 顺便说一句,它是一台Ubuntu机器因为这是Linux,你应该能够做到: 1) 查找Python

我有一个长期运行的python进程,它使用

    while True:
        do_something()
        pickle.dump(var, open('file','wb'))
我删除了“文件”,假设它无论如何都会被重写,但文件永远不见了。我以为每次调用open()时python都会创建一个新的文件处理程序。是否仍有恢复此文件的方法?进程仍在运行,它仍将写入“文件”


顺便说一句,它是一台Ubuntu机器

因为这是Linux,你应该能够做到:

1) 查找Python脚本的PID

ps -ef | grep myscript.py
2) 查看脚本的打开文件描述符

lsof -p <PID>
lsof-p
3) 确定您感兴趣的文件的文件描述符-行的末尾可能会显示“(已删除)”

4) 把那个文件复制一份

cp /proc/<PID>/fd/<filedes> /some/other/path
cp/proc//fd//some/other/path
请注意,如果您实际上已经用完了文件描述符,那么您可以通过这种方式找到的最新副本可能非常旧,具体取决于更新的频率以及脚本运行的时间。但是,总比什么都没有好。如果文件描述符确实不足,我希望
open()
可能会抛出异常


提到的另一种可能性是,可能您从未调用过
pickle.dump()
调用,在这种情况下,上述操作将毫无帮助,因为不会有任何文件需要恢复…

您确定脚本没有挂起到其他地方吗?您认为应该创建一个新文件是正确的。另外,这个脚本已经运行了多长时间了,您是否正在捕获有关此代码的异常?如果脚本已经运行了很长一段时间,可能是因为没有正确关闭打开的文件描述符,所以您达到了操作系统对打开的文件描述符的限制。我同意上面的评论,在几个层次上,脚本可能挂起在其他地方。如果脚本附加到文件中,我想应该是“w+”,而不仅仅是“w”。此外,您应该使用上下文管理器打开文件,在本例中为
with
语句。要检查文件的多个实例是否由于关闭不当而包含不必要的描述符,您可以使用“lsof | grep name _of _file”。我有一个非常类似的设置,我在web服务器上运行,从来没有遇到过问题到目前为止“正在消失”文件。我怀疑问题出在其他地方?可能有脚本挂在
do_something()
中,并且从未执行
dump
调用?您确定文件夹中没有~filename吗?