让我们说,你有一个应用程序,它消耗了所有的计算能力。现在你想做一些其他必要的工作。在Linux上是否有任何方法可以中断该应用程序并检查其状态,以便稍后可以从中断的状态恢复它?
特别是我对某种方式感兴趣,可以在另一台机器上停止并重新启动应用程序。这也可能吗?
答案 0 :(得分:5)
一般而言,检查点进程并非完全可能(因为进程不仅是一个地址空间,还有其他资源,如文件描述符和TCP / IP套接字......)。
在实践中,您可以使用一些检查点库,如BLCR等。在某些限制条件下,您可以将检查点图像从一个系统迁移到另一个系统(非常类似于源系统:相同的内核) ,相同版本的库和编译器等。)。
在virtual machine级别也可以迁移图像。其中一些非常好。
您还可以使用自己的检查点设备设计和实施您的软件。然后,您应该考虑使用garbage collection技术和术语。另请参阅Emacs(或Xemacs)unexec.c文件(与机器有很大关系)。
某些语言的实施&运行时具有检查点基元。 SBCL(一个免费的Common Lisp实现)能够save a core image并在以后重新启动它。 SML / NJ能够export an image。 Squeak(Smalltalk实现)也具备这种能力。
作为检查点的另一个例子,GCC编译器实际上能够使用persistence techniques编译单个*.h
标头(进入预编译的头文件,这是GCC堆的持久映像)
详细了解orthogonal persistence。它也是一个研究课题。 serialization也是相关的(您可能希望使用JSON,YAML,XML等文本格式)。您也可以使用hibernation技术(在整个系统级别上)。
答案 1 :(得分:3)
从手册页man kill
中断流程需要两个步骤:
停止
kill -STOP <pid>
和
继续
kill -CONT <pid>
其中<pid>
是进程ID。
答案 2 :(得分:2)
键入:Control + Z
以暂停进程(它发送SIGTSTP)
然后bg
/ fg
在后台或前台恢复
答案 3 :(得分:1)
在POSIX上从根本上无法检查单个流程。那是因为过程不是独立的;他们可以互动。如果没有别的,一个进程有一个唯一的进程ID,它可能存储在内部的某个地方,如果你用一个不同的进程ID恢复它,所有的地狱都可能会崩溃。如果进程使用任何类型的锁/同步原语,则尤其如此。当然,您也无法使用原来的相同的进程ID恢复该进程,因为这可能是由新进程执行的。
也许你可以通过使进程(和线程)id大约128位来解决这个问题,这样它们就是普遍独特的......
答案 4 :(得分:0)
在Linux上,通过发送此进程STOP信号可以实现。仪表通过发送CONT信号恢复它。请参阅kill手册。