救命,我搞砸了。
我有一个有点复杂的python脚本,它目前正在Ubuntu服务器的腻子窗口中运行。
我不小心用另一个油灰窗口覆盖了脚本,所以硬盘上的副本现在不见了,但脚本仍然在第一个窗口中从内存中运行。
这发生在我有机会运行此文件夹的备份之前。
有没有一种方法可以在第一个腻子窗口中从内存中获取脚本(目前正在运行)?
我还没有停止剧本,我想一旦我停止,它就会永远消失。
我可以以某种方式将它发送到后台进程(一些热键),然后从内存转储或其他地方收集脚本吗。我认为这样的事情必须在运行脚本的实际窗口中发生。
如果我能把.py拿回来就太好了,我听说Python在运行之前编译了脚本,如果是这样的话,人类可读的部分可能就不见了。
唉,今天压力很大。
感谢您的帮助,Mark.using
据我所知,Python不会将源代码保存在内存中,注释中提供的方法只会使可执行文件保持活动状态,而不会使脚本保持活动状态。转储程序的内存可能会让您获得字节码,但我不知道这可能需要付出多少努力。
相反,我会首先尝试一种非Python特定的方法,我已经成功地使用它来恢复我意外删除的Python源。这假设文件系统是ext2/3/4,并且您有root访问权限。
第一步(在任何恢复中)显然是尽量避免在系统上写入任何文件,以免覆盖您要查找的数据。在家庭系统上,如果可能的话,我可能会亲自将分区重新安装为只读分区,以避免更多的写入操作。我听说其他人建议快速拔掉插头,这可能会阻止操作系统/磁盘缓存写入磁盘,如果你真的很快,可能会为你保存一些额外的数据(甚至阻止删除)。在远程系统上,这两种方法都不是一个好主意(除非数据真的很重要,并且你可以把磁盘运给你或其他什么东西),因为如果某个东西突然变成只读的,系统可能会不喜欢它。
第二步是执行debugfs /dev/sdXY
,其中/dev/sdXY
是被删除文件所在的分区。在提示符中,说blocks /path/to/the/directory/the/removed/file/was/in
。然后,为目录中其他现有文件提供blocks
命令路径。现在,通过说quit
退出程序,并希望您看到的块号彼此接近。如果目录是旧的并且块号分散,请从最近的文件的块号开始。(也就是说,最后一次修改的分区尽可能接近被删除文件的最后一次更改时间)我们将尝试扫描目录中其他文件附近的分区内容,假设文件存储在这些文件附近。执行dd if=/dev/sdXY bs=4096 skip=BLOCKNUMBER count=COUNT |grep -C APPROXIMATE_LINE_COUNT_OF_THE_REMOVED_FILE WORD
,其中BLOCKNUMBER
是第一个块编号之前的某个数字,COUNT
是要搜索的某个合适的块编号,WORD
是源文件中包含的单词。如果你什么都没得到,试着在另一个文件的块附近钓鱼。如果时间不是问题,并且您可以想到一个只出现在已删除文件中的字符串(这样您就不会得到太多误报),那么您可以跳过所有这些,用grep -a WORD -C LINECOUNT /dev/sdXY
扫描整个磁盘。
另一种方法(你应该在另一种之前尝试)可能不适用于你,因为IIRC最新版本的Ubuntu(可能还有其他系统)默认情况下会将内核配置为阻止访问/dev/mem,那就是尝试扫描内存中的文件。只需执行grep -a WORD -C LINECOUNT /dev/mem
来扫描内存,而不是分区。(如果你在表单字段中写了很长的文本,但点击错误,浏览器清空了该字段,这也可以节省你的一天)
我回答这个问题已经晚了两年,但这就是我恢复脚本的方式。运行脚本后,在pycache文件夹中,会有一个与脚本同名的.pyc
(字节码)文件。你可以使用一个名为uncompile的第三方模块来反编译这个.pyc文件,以获取源代码。唯一的缺点是你的评论会丢失。但有总比没有好。
这是一个迟来的答案,但对于每个使用IDE的人来说,eclipse(其他人也有类似的东西)可以使用eclipse历史记录轻松恢复他们的*.py或其他文件。eclipse文档中的更多内容:https://help.eclipse.org/neon/index.jsp?topic=%2Forg.eclipse.platform.doc.user%2Ftasks%2Ftasks-87b.htm甚至更好:Eclipse,恢复最近的历史