我想知道是否可以生成一个“核心”文件,将 if 复制到另一台机器,然后继续在该机器上执行核心文件?
我见过 gcore 实用程序,它可以从正在运行的进程生成核心文件。但我不认为 gdb 可以基于核心文件继续执行。
有没有办法只转储堆/堆栈并在以后恢复它们?
我想知道是否可以生成一个“核心”文件,将 if 复制到另一台机器,然后继续在该机器上执行核心文件?
我见过 gcore 实用程序,它可以从正在运行的进程生成核心文件。但我不认为 gdb 可以基于核心文件继续执行。
有没有办法只转储堆/堆栈并在以后恢复它们?
在现代系统上,不是来自核心文件,不,你不能。为了在 Linux 上冻结和恢复单个进程,CryoPID和新的基于内核的检查点和重启正在开发中,但它们的能力目前非常有限。 OpenVZ和其他类似虚拟化的软件可以冻结和恢复整个系统。
还可以查看Condor项目。Condor 也可以通过并行作业来做到这一点。Condor 还包括监视器,例如,当某些人再次开始使用他们的工作站时,它们可以自动迁移您的进程。它真的是为在网络环境中利用空闲周期而设计的。
一般来说,这不足以让任意进程在另一台机器上继续。除了堆和堆栈状态,还可能有打开的 I/O 句柄、分配的硬件资源等。
您的选择是明确编写软件,使其在信号上转储状态,然后从转储状态恢复,或者在虚拟机中运行软件并将其迁移到备用主机 - Xen 和 Vmware 都支持冻结/恢复以及实时迁移。
也就是说,CryoPID试图准确地做到这一点,并且偶尔会成功。
As of Feb. 2017, there's a fairly stable and mature tool, called CRIU that depends on updates to the Linux Kernel made in version 3.11 (as this was done in Sep. 2013, most modern distros should have those incorporated into their kernel versions).
It can be installed via aptitude by simply calling sudo apt-get install criu
.
在某些情况下,这是可以做到的。例如,Emacs 构建过程的一部分是加载所有 Lisp 库,然后将内存映像转储到磁盘上以便快速加载。其他一些语言解释器也这样做(我主要考虑 Lisp 和 Scheme 实现)。但是,它们是专门为这种用途设计的,所以我不知道他们必须做些什么特殊的事情才能让它发挥作用。
我认为这对于随机程序来说很难做到,但是如果您编写了一个所有对象都支持序列化/反序列化的框架,那么您可以序列化程序使用的所有对象,然后将其发送到其他地方,并在另一端。
其他人对虚拟化的回答也在现场。
取决于机器。例如,它在非常小的嵌入式系统中非常可行。我认为它也在 Beowulf 集群和其他超级计算机类应用程序中实现了一些。
有很多原因你不能很容易地做你想做的事。例如,当您在另一台机器上恢复核心文件时,您如何解析您处理的已打开的文件描述符?那么套接字、命名管道、信号量或任何其他操作系统级别的资源呢?基本上,除非您的系统专门设计用于处理此类操作,否则您不能天真地转储核心文件并将其移动到另一台机器上。
我不相信这是可能的。但是,您可能想要研究虚拟化软件——例如Xen——它可以冻结整个系统映像并将其从一台机器移动到另一台机器。