如何在 Linux 中保存和恢复进程?
有时,您会遇到需要对进程进行快照并在以后使用其相同状态的情况。我们在 Linux 中将此保存进程状态以供以后使用的操作称为检查点。此操作通过获取正在运行的进程并将其保存到文件中来完成,然后您可以快速再次启动该进程而不会丢失其状态。
为了更容易理解,假设您有一个进程正在执行一些计算。为了防止在系统崩溃或重新启动机器时数据丢失,您可以在其运行时将其状态保存到文件中。然后,当您需要它时,只需恢复该文件即可。此操作有助于节省内存和时间。
为了实现这一点,我们在 Linux 中有一个强大的工具叫做 CRIU,它可以为我们完成所有这些工作。
注意 - 此检查点/恢复功能需要在内核级别进行一些配置,因此首先,您需要检查您的内核中是否启用了检查点/恢复支持。您可以通过读取并查找CONFIG_CHECKPOINT_RESTORE位于/boot/config:中的配置文件来检查此项。
grep CONFIG_CHECKPOINT_RESTORE /boot/config-$(uname -r)
您应该获得 -
CONFIG_CHECKPOINT_RESTORE=y
什么是 CRIU?
CRIU 代表“用户空间中的检查点/恢复”。此工具的作用是读取 Linux 中进程的状态并将其保存到一组称为映像文件的文件中。
CRIU 尝试捕获进程的完整状态,以便以后在同一台机器或另一台机器上重新创建相同的进程。
此图像说明了使用 CRIU 在 Linux 中检查点和恢复进程的过程。
它获取进程状态的转储,将其放入文件中,然后恢复它们。这就是检查点和恢复的含义。
CRIU 使用标准内核 API(例如转储、prctl、netlink和系统调用)来转储进程,并使用相同的方法来恢复进程。
安装 CRIU
默认情况下,CRIU 未安装在 Linux 中,但它几乎在所有 Linux 发行版的软件包存储库中都可用。
对于Debian / Ubuntu / Mint -
apt install criu
注意 - 如果您使用的是 Ubuntu 24.04,由于某些依赖项问题,CRIU 不在官方存储库中。您需要使用 CRIU 团队提供的此 PPA 添加它 -
sudo add-apt-repository ppa:criu/ppa
更新系统并安装 CRIU -
sudo apt update sudo install criu
对于Arch / 基于 Arch 的发行版 -
pacman -S criu
如果您使用的发行版在官方存储库中没有 CRIU,或者您想从源代码构建它,您可以查看 CRIU 网站。
安装完成后,您可以在终端中键入criu来检查该工具是否已成功安装。您应该会看到如下输出 -
使用 CRIU 的示例
我们已成功安装 CRIU。转储进程的步骤对于任何进程都是相同的。
- 首先,您需要获取要转储的进程的 PID。
- 其次,将使用 CRIU 工具转储进程。使用 CRIU 转储进程的命令如下
criu dump -t <pid> --images-dir /path/to/save/images --leave-running
这里,
- <pid> - 指定进程 PID。
- <--images-dir> - 指定保存转储的目录名称。
- /path/to/save/images - 将包含转储文件的目录,确保在开始转储之前创建了此目录;否则,您将收到错误。
- --leave-running - 此选项在检查点后保持进程运行;否则,在执行转储后进程将停止。
让我们以一个示例来在实际示例中应用这些步骤。为了演示这一点,让我们运行一个需要一些时间才能完成的进程。例如 -
打开终端并运行以下命令 -
sleep 3600 &
此进程将运行一段时间,在此示例中为 3600 秒(1 小时);末尾的&符号表示我们需要在后台运行它。现在,我们确实有正在运行的进程了。
第二件事,我们应该做的是获取此进程的 PID。我们可以使用pregrp -
pgrep sleep
其输出为 -
8521
第三件事,创建存储文件的目录 -
mkdir sleepdump
这里我称之为sleepdump,您可以根据自己的喜好命名它。
之后我们获取了进程 ID 并创建了存储文件的目录,现在我们应该准备好使用 CRIU 了 -
sudo criu dump -t 8521 --images-dir ~/sleepdump --shell-job
这里我们添加–shell-job告诉 CRIU 此进程是从 shell 运行的。如果没有此选项,CRIU 将不会捕获与 shell 上下文相关的所有必要数据,因此转储将失败。
我们没有添加leave-running选项,因此转储后进程将终止。
执行此命令后,我们应该在创建的目录(在此示例中为sleepdump)中获得映像文件 -
此时,我们刚刚成功转储了我们的进程。现在是时候学习如何恢复它了。
要使用 CRIU 恢复进程,我们使用以下命令 -
sudo criu restore --images-dir ~/path/to/save/images
我们示例中的路径在这里是sleepdump -
sudo criu restore --images-dir ~/sleepdump
这应该会恢复进程并再次运行它。我们在这里执行的进程适用于您想要转储的任何进程。
结论
在本教程中,我们演示了如何使用强大的工具 CRIU 在 Linux 中执行检查点。我们只做了一个简单的示例,但 CRIU 功能更强大,并且有很多功能等待探索。