我为一个相当困难的数学问题开发了一种算法,这可能需要几个月的时间才能完成。由于我的资源有限,我在 Ubuntu 12.04 (x86) 笔记本电脑上启动了此操作。现在我想安装一些更新并实际重新启动笔记本电脑(“请重新启动”消息只是烦人)。
有没有办法保存整个进程,包括其分配的内存,以便在重新启动后继续运行?
以下是有关您可能需要的流程的一些信息。如果需要,请随时询问更多信息。
- 我用命令“”或“time ./binary > ./somefile &”在终端中调用了该进程
./binary > ./somefile &
,我不太记得了。 - 它正在将一些调试信息打印到 std::cerr (不经常)。
- 目前它使用了大约 600.0 kiB,尽管这个数字会增加,但不太可能快速增加。
- 该进程以正常优先级运行
- 内核是3.2.0-26-generic-pae,CPU是AMD,操作系统是Ubuntu 12.04 x86。
- 它运行了 9 天零 14 小时(时间太长,无法取消;-))
答案1
最好/最简单的解决方案是更改程序以将状态保存到文件中,然后重用该文件来恢复进程。
基于维基百科页面关于应用程序快照有多种选择:
- 还有冷冻剂但它似乎没有维护。
- Linux 检查点/重启似乎是一个不错的选择,但您的内核需要启用
CONFIG_CHECKPOINT_RESTORE
。 - 克里乌可能是最新的项目,也可能是您最好的选择,但也取决于一些特定的内核选项您的发行版可能尚未设置。
这已经太晚了,但另一种更实用的方法是在专用虚拟机中启动进程,然后挂起并恢复整个虚拟机。根据您的虚拟机管理程序,您还可以在不同主机之间移动计算机。
未来,请考虑在哪里运行长时间运行的进程、如何并行化它们以及如何处理问题,例如磁盘已满、进程被终止等。
答案2
一种相当“便宜”的方法是在虚拟机中进行处理(例如,使用 VirtualBox)。在关闭之前暂停虚拟机并保存状态。启动后恢复虚拟机和状态。
这样做的缺点是需要终止并重新启动作业。但如果它实际上要运行几个月,那么 9 天的差异就变得微不足道了(6 个月内增加了 5%)。
编辑:我刚刚意识到乌尔里希已经在他的清单上的第 4 项中提到了这一点。
我仍然鼓励您考虑将此作为一种选择,特别是因为所有替代方案似乎都不是一个可靠的解决方案。每个都有可能不起作用的原因。
我认为最好的办法是尝试其中之一,如果它不起作用,请在虚拟机中重新启动作业。
答案3
看一下该工具冷冻PID。
在主页上:“CryoPID 允许您捕获 Linux 中正在运行的进程的状态并将其保存到文件中。然后可以使用该文件在稍后重新启动后甚至在另一台计算机上恢复该进程。”
答案4
如果您最终需要重新启动程序,我鼓励您花一些时间向代码中添加一些功能,这可能会在将来节省您的时间。
如果进程要运行很长时间,并且进程在运行时崩溃,那么重新启动计算机时能够保存整个进程状态可能没有多大帮助。
我鼓励您将程序输出到文件“检查点”数据。这些数据应该足以使您的程序能够从保存检查点文件时的状态恢复。您无需保存整个过程,只需保存计算中使用的相关变量的快照,就足以让您的计算从中断处恢复。您的代码还需要包含某种从该文件读取数据的方法,以获得其起始状态。
您可以设置代码,以便当您向其发送信号时,它会保存这些检查点文件之一,这样您就可以在任何时候保存计算的“状态”。
此外,能够看到数据如何随着计算的进行而变化本身可能很有趣!