据我所知,所有linux进程实际上都是文件,是否可以将正在运行的进程从一台机器复制到另一台机器?
例如 - 将正在运行的 tomcat 服务器从一台计算机复制到另一台计算机,而无需重新启动服务器
答案1
据我所知,所有linux进程实际上都是文件
你不应该太从字面上理解这个比喻。 Linux 进程确实可以通过伪文件系统访问,以进行调试、监视和分析,但进程不仅仅是这些文件,将它们从源主机/proc
文件系统“复制”到目标/proc
文件系统是注定的。
是否可以在机器之间复制正在运行的进程?
在主机之间移动正在运行的进程的严重问题之一是如何处理该进程正在使用的打开文件描述符。如果进程正在读取或写入文件,则该文件(或精确的克隆)必须在目标主机上可用。与套接字相关的文件描述符处理起来很棘手,因为它们绑定的 IP 地址可能会从一台主机更改为另一台主机。与其他进程共享内存段的进程在迁移后将停止执行此操作。 PID 冲突也可能发生,如果正在运行的进程与传入进程具有相同的 pid,则需要更改其中之一。亲子关系就会失去,我刚刚抓到了潜在的问题。
尽管存在这些问题,有提供该功能的技术解决方案称为“应用程序检查点“ 喜欢DMTCP和CRIU。这与 VMWare、VirtualBox、Oracle VM 等虚拟机管理程序在创建虚拟机时所使用的类似实时迁移/传送。使用虚拟机,这项工作实际上“更简单”,因为整个操作系统都被移动,包括文件描述符、文件系统、内存、网络和其他设备等。
答案2
是的,这是可能的。莫西克斯 (http://www.mosix.org)在 Linux 机器之间进行进程迁移(如 @jlliagre 答案中的维基百科链接中所述),是开源的并且不需要内核补丁。它适用于 HPC 应用程序,可能不是您想要的,但我想我会为后代提及。
答案3
不,不可能移动过程(即正在运行的程序)从一台 Unix 机器到另一台。
一些服务网络服务、数据库服务或路由器等提供冗余选项,例如故障转移和/或负载平衡。这意味着您有多个服务副本在多台计算机上运行,如果一台计算机出现故障,另一台计算机将接管,或者它们分担提供服务的负载,可能会在彼此之间复制数据库/状态以保持最新状态。
这些类型的服务会从一台机器“移动”到另一台机器,而提供服务的进程却不会移动。
然而,这是特定服务的特性,而不是 Unix 的特性。
您可能会找到有关以下内容的更多信息服务器故障论坛。
答案4
不,目前还不可能。当进程属于服务时。然后服务到服务流程的转移就成为可能。但这需要操作系统级别的更改。