如何通过将其内存存储到磁盘上并在以后还原来“休眠” Linux中的进程?


99

是否可以在Linux中“休眠”进程?就像笔记本电脑中的“休眠”一样,我会将进程使用的所有内存写入磁盘,从而释放RAM。然后,以后我可以“继续执行该过程”,即从内存中读取所有数据并将其放回RAM,然后我可以继续执行我的过程吗?


8
有趣的问题:D
危险状态

您所描述的实际上通常被称为“检查点”,使用该词进行搜索可能会更好。
Tim Post

一定是个好功能。休眠与关闭。
维塔利·法德耶夫

Answers:


54

我曾经维护过CryoPID,这是一个完全可以满足您所谈论内容的程序。它将程序的地址空间,VDSO,文件描述符引用和状态的内容写入文件,以便以后进行重构。当Linux本身没有可用的钩子时,CryoPID开始运行,并且完全在用户空间中工作(实际上,它仍然可以工作,具体取决于发行版/内核/安全性设置)。

问题包括(确实)套接字,待处理的RT信号,许多X11问题,​​glibc缓存getpid()实现等。伯纳德(Bernard)离开随机存取技术后,对我们中的少数人来说,随机存取(尤其是VDSO)是无法克服的。但是,它很有趣,并成为了几篇硕士论文的主题。

如果您只是在考虑一个可以保存其运行状态并直接重新启动进入该状态的程序,那么从程序本身内部保存信息(可能是在维修信号时)就容易多了。


5
不幸的是,自2014年7月起,不再维护CryoPID,并且不能在最新的内核上运行。但是与此同时,新项目诞生了(即使在TCP连接“休眠”中也采取了一些措施)。我在下面给出了具有更新信息的答案。看看这个!;)
dappiu 2014年

1
@dappiu太好了-但是CryoPID只是此答案中的一个例子,以说明它有多棘手,在此我继续建议他们以易于恢复的方式处理程序内部的状态保存。CryoPID停滞不会使答案变得不那么重要。
蒂姆·波斯特

Cryopid2最近更活跃(2013年):sourceforge.net/projects/cryopid2
Leopd 2014年

31

自2014年起,我想在此发布状态更新。

可接受的答案表明CryoPID可作为执行Checkpoint / Restore的工具,但我发现该项目没有维护,无法使用最新的内核进行编译。现在,我发现了两个主动维护的项目,它们提供了应用程序检查点功能。

第一个是我建议的原因,因为运气更好,它是CRIU ,它主要在用户空间中执行检查点/还原,并且需要启用内核选项CONFIG_CHECKPOINT_RESTORE。

在用户空间中检查点/还原,或CRIU(发音为kree-oo,IPA:/krɪʊ/,俄语:криу)是Linux操作系统的软件工具。使用此工具,您可以冻结一个正在运行的应用程序(或其一部分),并将其作为文件集合检查点到硬盘上。然后,您可以使用文件从冻结点开始还原并运行该应用程序。CRIU项目的独特之处在于它主要在用户空间中实现。

后者是DMTCP ; 从他们的主页引用:

DMTCP(分布式多线程检查点)是一种透明检查多个并发应用程序(包括多线程和分布式应用程序)状态的工具。它直接在用户二进制可执行文件上运行,而无需任何Linux内核模块或其他内核修改。

在参数上也有一个不错的Wikipedia页面:Application_checkpointing


20

ctrl-z在这种情况下,提到的答案实际上是在用信号停止过程SIGTSTP。您可以使用以下命令发出停止信号kill

kill -STOP <pid>

这将暂停该过程的执行。它不会立即释放它所使用的内存,但是由于其他进程需要该内存,因此被停止的进程使用的内存将逐渐被换出。

当您想再次唤醒它时,请使用

kill -CONT <pid>

实际上,仅当您希望已停止的进程能够在系统关闭/重新启动后继续运行时,才真正需要更复杂的解决方案,例如CryoPID-听起来并不是您需要的。


13

问题在于恢复程序已打开的流-文件和套接字。

当整个操作系统进入休眠状态时,显然可以还原本地文件等。网络连接没有,但是访问互联网的代码通常会进行更多的错误检查,并且可以保留错误条件(或应该保留)。

如果您按程序进行了休眠(没有应用程序支持),您将如何处理打开的文件?如果在此期间另一个进程访问这些文件怎么办?等等?

在未加载程序时保持状态将很困难。

简单地挂起线程并让其交换到磁盘上会产生大致相同的效果吗?

或在虚拟机中运行程序,然后让VM处理挂起。


12

简短的回答是“是,但并非总是可靠”。查看CryoPID:

http://cryopid.berlios.de/

打开文件确实将是最常见的问题。CryoPID明确指出:

打开的文件和偏移量将恢复。已取消链接并且无法在文件系统上访问的临时文件始终保存在映像中。恢复时不存在的其他文件尚未还原。计划支持在这种情况下保存文件内容。

尽管CryoPID支持tcpcp进行连接恢复,但相同的问题也将影响TCP连接。


3
点击提交按钮后,我现在意识到这很像CryoPID的垃圾邮件/广告。确实不是,我只是对该实用程序的满意用户。
Ulisses黑山共和国



6

我扩展了Cryopid,以生产可从SourceForge获得的名为Cryopid2的软件包。这样既可以迁移进程也可以使其休眠(以及所有打开的文件和套接字-套接字/管道中的数据在休眠时会被吸入进程中,并在进程重新启动时吐回到这些文件中)。

我没有参与该项目的原因是我不是内核开发人员-这两个(和/或原始的cryopid)都需要聘请可以让他们使用最新内核(例如Linux 3.x)运行的人员。 。

Cryopid方法确实有效-可能是我遇到的Linux中通用进程休眠/迁移的最佳解决方案。


3

正如其他人指出的那样,操作系统很难提供此功能,因为应用程序需要内置一些错误检查才能处理中断的流。

但是,顺便提一句,某些使用虚拟机的编程语言和工具明确支持此功能,例如Self编程语言


0

Ctrl-Z增加了交换进程页面的机会,但是并不能完全释放进程的资源。完全释放进程资源的问题在于,诸如文件句柄,套接字之类的东西是进程要使用的内核资源,但是却不知道如何单独持久化。因此Ctrl-Z就可以了。


0

在2.2和2.4天内对Linux的检查点/恢复进行了一些研究,但从未使它超过原型。可能存在某些可能的值(在其他答案中有警告)-我可以编写一个内核模块来做到这一点。但是对于可能的共同价值(我可以从商业Linux发行版的Shell中实现它),尚不可能。



0

添加另一个解决方法:您可以使用virtualbox。在常规虚拟机中运行您的应用程序,并且只要需要就可以简单地“保存计算机状态”。我知道这不是答案,但是我认为如果没有实际选择,这可能会很有用。

如果由于某种原因您不喜欢virtualbox,vmware和Qemu都不错。


-2

ctrl+z在Linux,但我不知道它提供了你所指定的功能。我怀疑你问了这个问题,因为它没有

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.