【问题标题】:Recovering file of long running python process恢复长时间运行的python进程的文件
【发布时间】:2015-08-20 17:22:48
【问题描述】:

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

转储泡菜
    while True:
        do_something()
        pickle.dump(var, open('file','wb'))

我删除了“文件”,假设它无论如何都会被重写,但文件永远消失了。我认为每次调用 open() 时 python 都会创建一个新的文件处理程序。有没有办法恢复这个文件?该进程仍在运行,它仍会写入“文件”。

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

【问题讨论】:

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

标签: python file pickle recovery


【解决方案1】:

既然是 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() 电话,在这种情况下,上述方法根本无济于事,因为不会有任何文件可以恢复...

【讨论】:

    猜你喜欢
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    相关资源
    最近更新 更多