假设您有一个应用程序,它正在消耗所有的计算能力。现在你想做一些其他必要的工作。在 Linux 上是否有任何方法可以中断该应用程序并检查其状态,以便稍后它可以从它被中断的状态中恢复?
特别是我对一种可以在另一台机器上停止并重新启动应用程序的方式感兴趣。这也可能吗?
假设您有一个应用程序,它正在消耗所有的计算能力。现在你想做一些其他必要的工作。在 Linux 上是否有任何方法可以中断该应用程序并检查其状态,以便稍后它可以从它被中断的状态中恢复?
特别是我对一种可以在另一台机器上停止并重新启动应用程序的方式感兴趣。这也可能吗?
一般来说,检查点进程是不可能的(因为进程不仅是一个地址空间,而且还有其他资源,如文件描述符和 TCP/IP 套接字......)。
在实践中,您可以使用一些检查点库,如BLCR等。在某些限制条件下,您可以将检查点映像从一个系统迁移到另一个系统(非常类似于源系统:相同的内核、相同版本的库和编译器, ETC。)。
也可以在虚拟机级别迁移映像。其中一些非常适合这一点。
您还可以使用自己的检查点机制来设计和实施您的软件。然后,您应该考虑使用垃圾收集技术和术语。还要查看 Emacs (或Xemacs)unexec.c文件(严重依赖机器)。
一些语言实现和运行时具有检查点原语。SBCL(一个免费的 Common Lisp 实现)能够保存核心图像并在以后重新启动它。SML/NJ 能够导出图像。Squeak(Smalltalk 实现)也有这种能力。
作为检查点的另一个示例,GCC 编译器实际上能够通过使用持久性技术来编译单个*.h
头文件(到预编译的头文件,它是 GCC 堆的持久映像)。
阅读有关正交持久性的更多信息。这也是一个研究课题。序列化也是相关的(您可能希望使用 JSON、YAML、XML 等文本格式)。您还可以使用休眠技术(在整个系统级别)。
从手册页man kill
中断进程需要两个步骤:
停止
kill -STOP <pid>
和
接着说
kill -CONT <pid>
<pid>
进程ID在哪里。
类型:Control + Z
暂停一个进程(它发送一个 SIGTSTP)
然后bg
/fg
在后台或前台恢复它
在 POSIX 上检查单个进程基本上是不可能的。那是因为进程不是独立的。他们可以互动。如果没有别的,一个进程有一个唯一的进程 ID,它可能存储在内部某个地方,如果你用不同的进程 ID 恢复它,所有的地狱都可能会崩溃。如果进程使用任何类型的锁/同步原语,则尤其如此。当然,您也不能使用它最初拥有的相同进程 ID 恢复进程,因为这可能会被新进程占用。
也许您可以通过将进程(和线程)ID 设置为 128 位左右来解决问题,这样它们是普遍唯一的......
在 linux 上,可以通过发送此进程 STOP 信号来实现。请通过发送 CONT 信号来恢复它。请参考杀死手册。