您可以冻结C/C++进程并在不同的主机上继续运行吗?

问题描述:

我想知道是否可以生成一个“核心”文件,如果复制到另一台机器,然后继续执行该机器上的核心文件?您可以冻结C/C++进程并在不同的主机上继续运行吗?

我已经看到了gcore实用程序,它将从正在运行的进程中创建核心文件。但我不认为gdb可以基于核心文件继续执行。

有什么办法,只是转储堆/堆栈和和恢复那些在稍后的点?

+1

这与C/C++有什么关系? – camh 2008-10-10 22:37:17

在现代系统上,不是来自核心文件,也不是。为了冻结和恢复Linux上的单个进程,CryoPID和新的Kernel-based checkpoint and restart正在开发中,但他们的功能目前非常有限。 OpenVZ和其他虚拟化软件可以冻结和恢复整个系统。

它被称为process migration

mosixOpenMosix曾经是能够做到这一点。现在,迁移整个虚拟机是最容易的。

我不相信这是可能的。但是,您可能需要查看虚拟化软件 - 例如Xen - 可以将整个系统图像从一台机器冻结并移动到另一台机器。

这通常不足以让任意进程在另一台机器上继续运行。除了堆和栈的状态,另外,也同时打开I/O句柄,分配硬件资源,等等,等等

你的选择是要么明确写入软件的方式,让它转储的状态信号并稍后从转储状态恢复,或者在虚拟机中运行软件并将其迁移到备用主机 - Xen和Vmware都支持冻结/恢复以及实时迁移。

这就是说,CryoPID尝试这样做正是这种偶尔成功。

在某些情况下,可以这样做。例如,Emacs构建过程的一部分是加载所有Lisp库,然后将内存映像转储到磁盘上以便快速加载。其他一些语言解释器也这样做(我主要是在考虑Lisp和Scheme实现)。但是,它们是专门为这种用途而设计的,所以我不知道他们必须做些什么才能使其发挥作用。我认为这对于一个随机程序来说很难做到,但是如果你编写了一个框架,其中所有的对象都支持序列化/反序列化,那么你就可以序列化你的程序使用的所有对象,然后把它运送到其他地方,并且在另一端对它们进行反序列化。

其他人关于虚拟化的答案也在现场。

取决于机器。例如,在非常小的嵌入式系统中非常可行。我认为它在Beowulf集群和其他超级计算应用程序中也有所实现。

还可以结帐出Condor项目。 Condor也可以通过并行作业来实现。 Condor还包括一些监视器,例如,当某些监视器再次开始使用他们的工作站时,它们可以自动迁移您的过程。它的设计非常适合在网络环境中使用备用周期。

有很多原因,你不能很容易地做你想做的事情。例如,当您在另一台计算机上恢复核心文件时,如何解决您处理的文件描述符已打开?关于套接字,命名管道,信号量或其他操作系统级资源呢?基本上除非你的系统是专门设计来处理这样的操作,否则你不能天真地转储核心文件并将其移动到另一台机器上。

截至2017年2月,有一个相当稳定和成熟的工具,名为CRIU,取决于版本3.11中制作的Linux内核的更新(因为这是在2013年9月完成的,大多数现代发行版都应该包含他们的内核版本)。

只需拨打sudo apt-get install criu即可通过aptitude进行安装。

Instructions on how to use it.