保存整个过程以在重启后继续

ste*_*fan 60 process reboot

我为一个相当难的数学问题开发了一个算法,这个问题可能需要几个月才能完成。由于我的资源有限,我在我的 Ubuntu 12.04 (x86) 笔记本电脑上开始了这个。现在我想安装一些更新并实际重新启动笔记本电脑(“请重新启动”消息很烦人)。

有没有办法保存整个进程,包括其分配的内存,以便在重启后继续?

以下是有关您可能需要的流程的一些信息。如果需要,请随时询问更多信息。

  • 我在终端中使用命令“ ./binary > ./somefile &”或“time ./binary > ./somefile &”调用了该进程,我真的记不清了。
  • 它正在向 std::cerr 打印一些调试信息(不经常)。
  • 它目前使用大约 600.0 kiB,即使这会增加,也不太可能迅速增加。
  • 进程以正常优先级运行
  • 内核是3.2.0-26-generic-pae,CPU是AMD,操作系统是Ubuntu 12.04 x86。
  • 它从 9 天 14 小时开始运行(太长了无法取消它;-))

Ulr*_*gel 47

最好/最简单的解决方案是更改您的程序以将状态保存到文件中,然后重用该文件来恢复进程。

基于有关应用程序快照的维基百科页面,有多种选择:

  1. 还有cryopid,但似乎没有维护。
  2. Linux 检查点/重启似乎是一个不错的选择,但您的内核需要已CONFIG_CHECKPOINT_RESTORE启用。
  3. criu可能是最新的项目,也可能是您最好的选择,但也取决于您的发行版可能尚未设置的某些特定内核选项

这已经太晚了,但另一种更实际的方法是在专用 VM 中启动您的进程,然后挂起和恢复整个虚拟机。根据您的管理程序,您还可以在不同主机之间移动机器。

未来考虑在哪里运行长期运行的进程,如何并行化它们以及如何处理问题,例如磁盘已满、进程被终止等。


bah*_*mat 22

一种相当“便宜”的方法是在 VM 中进行处理(例如,使用 VirtualBox)。在关闭之前挂起 VM 并保存状态。启动后恢复虚拟机和状态。

这确实具有需要终止并重新启动作业的缺点。但如果它真的要运行几个月,那么 9 天的差异就变得微不足道了(6 个月内增加了 5%)。


编辑:我刚刚意识到 Ulrich 已经在他的清单上未编号的第 4 项中提到了这一点。

我仍然鼓励您将其视为一种选择,特别是因为没有一种替代方案看起来像一个强大的解决方案。每个人都有可能无法工作的原因。

我想最好的办法是尝试其中之一,如果它不起作用,则在 VM 中重新启动作业。


Tim*_*Tim 18

看一看工具CryoPID

来自主页:“CryoPID 允许您捕获 Linux 中正在运行的进程的状态并将其保存到一个文件中。然后该文件可用于稍后恢复进程,无论是在重新启动后还是在另一台机器上。”

  • 之前使用它来保存在 Linux 机器上运行的 python 脚本的状态,并将其移动到 FreeBSD 机器并在那里恢复。那里有一些神秘的魔法;) (6认同)
  • @JohnP 现在可以在 GitHub 上找到:https://github.com/maaziz/cryopid (3认同)

Jam*_*ack 7

如果您最终需要重新启动您的程序,我建议您花一些时间在您的代码中添加一些功能,以便在将来节省您的时间。

如果进程要运行很长时间,如果进程在运行时崩溃,能够在重新启动机器时保存整个进程状态可能不会有很大帮助。

我鼓励您将程序输出到文件“检查点”数据。这些数据应该足以让您的程序能够从保存检查点文件时的状态恢复。您不需要保存整个过程,只需保存计算中使用的相关变量的快照,足以让您的计算从停止的地方继续。您的代码还需要包含从该文件中读取数据的某种方式,以获得它的起始状态。

您可以设置代码,以便在向其发送信号时,它会保存这些检查点文件之一,因此您可以随时保存计算的“状态”。

此外,能够看到数据如何随着计算的进行而变化本身可能很有趣!