问题 你可以冻结一个C / C ++进程并在另一个主机上继续它吗?


我想知道是否可以生成“核心”文件,将if复制到另一台机器然后继续执行该机器上的核心文件?

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

有没有办法只是转储堆/堆栈,并在以后恢复它们?


6050
2017-10-10 19:57


起源

这与C / C ++有什么关系? - camh
同意camh,请你删除C / C ++参考。您可以拥有一个进程,其代码完全是asm,问题是有效的。 - Dan Cristoloveanu


答案:


在现代系统上,不是从核心文件,不是你不能。要在Linux上冻结和恢复单个进程, CryoPID 和新的 基于内核的检查点和重启 正在进行中,但他们的能力目前非常有限。 OpenVZ的 和其他类似虚拟化的软件可以冻结和恢复整个系统。


4
2017-10-10 20:04





它被称为 流程迁移

MOSIX 和 openMosix的 曾经能够做到这一点。现在,迁移整个VM最简单。


5
2017-10-10 20:01





还要结帐 秃鹰 项目。 Condor也可以通过并行作业完成这项工作。 Condor还包括可以自动迁移过程的监视器,例如,当某些监视器再次开始使用它们的工作站时。它真正设计用于在网络环境中使用备用周期。


3
2017-10-10 22:45





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

您可以选择以某种方式显式编写软件,使其在信号上转储状态,然后从转储状态恢复,或者在虚拟机中运行软件并将其迁移到备用主机 - Xen和Vmware都支持冻结/恢复以及实时迁移。

那说, CryoPID 试图做到这一点并偶尔成功。


2
2017-10-10 20:03





在某些情况下,这可以做到。例如,Emacs构建过程的一部分是加载所有Lisp库,然后将内存映像转储到磁盘上以便快速加载。其他一些语言解释器也这样做(我主要考虑Lisp和Scheme实现)。但是,它们是专门为这种用途而设计的,所以我不知道他们必须做些什么特别的事情才能让它发挥作用。

我认为对于随机程序来说这很难做,但是如果你编写了一个框架,其中所有对象都支持序列化/反序列化,那么你可以序列化你的程序使用的所有对象,然后将其发送到其他地方,并在那里对它们进行反序列化。另一端。

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


1
2017-10-10 20:04





截至2017年2月,有一个相当稳定和成熟的工具,称为 CRIU 这取决于3.11版本中对Linux内核的更新(因为这是在2013年9月完成的,大多数现代发行版都应该将其整合到其内核版本中)。

它可以通过简单的调用通过aptitude安装 sudo apt-get install criu

有关如何使用它的说明。


1
2018-02-16 16:50





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


0
2017-10-10 20:31





有很多原因你不能轻易做到你想要的。例如,当您在另一台计算机上还原核心文件时,如何解析您处理的文件描述符已打开?套接字,命名管道,信号量或任何其他操作系统级资源怎么样?基本上除非您的系统专门设计用于处理此类操作,否则您无法天真地转储核心文件并将其移动到另一台计算机。


0
2017-10-10 23:10





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


-1
2017-10-10 20:01