是否有可能中断一个进程和检查点,以便稍后恢复?

比方说,你有一个应用程序,它正在消耗所有的计算能力。 现在你想做一些其他必要的工作。 Linux上有什么办法可以中断那个应用程序和检查点的状态,以便稍后可以从它被中断的状态恢复。

特别是我感兴趣的方式,应用程序可以停止并在另一台机器上重新启动。 这可能吗?

Solutions Collecting From Web of "是否有可能中断一个进程和检查点,以便稍后恢复?"

一般来说,检查点的进程并不是完全可能的(因为进程不仅是一个地址空间,而且还有其他资源,如文件描述符,TCP / IP套接字等)。

在实践中,你可以使用像BLCR等检查点库。在某些限制条件下,你可能能够将一个检查点镜像从一个系统迁移到另一个系统(非常类似于源代码:相同的内核,相同版本的库和编译器等)。

在虚拟机级别迁移图像也是可能的。 其中一些是相当好的。

您也可以使用您自己的点检机器来设计和实施您的软件。 那么,你应该考虑使用垃圾收集技术和术语。 也看看Emacs(或Xemacs ) unexec.c文件(这是非常依赖于机器)。

一些语言的实现和运行时有检查点的原语。 SBCL (免费的Common Lisp实现)能够保存核心映像,并在稍后重新启动。 SML / NJ能够导出图像 。 Squeak (一个Smalltalk的实现)也有这样的能力。

作为检查点的另一个例子,GCC编译器实际上可以通过使用持久化技术来编译单个*.h头(预编译的头文件,这是一个GCC堆的持久化图像)。

阅读更多关于正交持久性 。 这也是一个研究课题。 序列化也是相关的(你可能想要使用JSON,YAML,XML等文本格式)。 您也可以使用休眠技术(在整个系统级别)。

从man页面man kill

中断一个过程需要两个步骤:

停止

 kill -STOP <pid> 

接着说

 kill -CONT <pid> 

其中<pid>是进程ID。

类型: Control + Z暂停进程(它发送一个SIGTSTP)

然后bg / fg在后台或前台恢复

在POSIX上检查单个进程是根本不可能的。 那是因为流程不是独立的; 他们可以互动。 如果没有别的,一个进程有一个唯一的进程ID,它可能已经存储在内部的某个地方,如果你用一个不同的进程ID恢复它,那么所有的进程都可能会失效。 如果进程使用任何类型的锁定/同步原语,则尤其如此。 当然,你也不能用原有的进程ID恢复进程,因为这可能是由一个新进程来完成的。

也许你可以通过制作128位左右的进程(和线程)ID来解决这个问题,这样他们就可以通用了。

在linux上,通过发送这个进程的STOP信号是不可能的。 让你继续发送CONT信号。 请参考杀手册。