如何停止 Linux 进程以供稍后执行换出其内存

ide*_*all 20 linux swap process virtual-memory

我想停止一个长时间运行的进程,这样它就不会消耗任何 CPU 或物理内存资源,以便将来恢复相同的进程

我知道,CPU部分是可以实现的使用SIGSTOPSIGCONT 信号,但有可能页出(换出在工艺脏页的情况下),立即一(停止)进程的专用内存RSS?

vir*_*tex 11

您可能会研究一种称为检查点/恢复的技术。这将允许您执行一个正在运行的进程并将其状态保存到一组文件中,然后在以后恢复它。
要使用它,首先要安装 criu [ git , wiki ]程序(yum install criuapt install criu)。

要检查正在运行的进程,请创建一个空目录来保存其文件并将 cd 放入该目录。

mkdir /var/tmp/checkpoint
cd /var/tmp/checkpoint
Run Code Online (Sandbox Code Playgroud)

现在检查正在运行的进程。在这种情况下,我使用 --shell-job,因为我的进程在带有关联 tty 的 shell 中运行。

criu dump -t 404 --shell-job
Run Code Online (Sandbox Code Playgroud)

404 是我要检查点的进程的 pid。当我这样做时,我看到我正在运行的进程被杀死,我的 /var/tmp/checkpoint 目录被填充了一组恢复它所需的文件。

为了恢复这个过程,我确保我在检查点文件所在的目录中并进行恢复。

cd /var/tmp/checkpoint
criu restore --shell-job
Run Code Online (Sandbox Code Playgroud)

该过程将在运行它的终端中从它停止的地方开始。如果我终止这个正在运行的进程并criu restore --shell-job再次运行,该进程将恢复到检查点并再次启动。

希望这可以帮助。

  • 这不符合 OP 声称他们想做的事情。试试看——使用的内存不会减少。它只会从进程私有内存切换到磁盘缓存(由于写出文件集)。它只是做了一个额外的保存步骤和一个额外的恢复步骤,并且以相同的方式使用(和弹出)相同的内存。事实上,这可能会使事情变得更糟,因为由于生成所有要写出的新内容而导致某些内存重复。 (4认同)