如何在 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

此图像说明了使用 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来检查该工具是否已成功安装。您应该会看到如下输出 -

Install 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)中获得映像文件 -

Example CRIU

此时,我们刚刚成功转储了我们的进程。现在是时候学习如何恢复它了。

要使用 CRIU 恢复进程,我们使用以下命令 -

sudo criu restore --images-dir ~/path/to/save/images

我们示例中的路径在这里是sleepdump -

sudo criu restore --images-dir ~/sleepdump

这应该会恢复进程并再次运行它。我们在这里执行的进程适用于您想要转储的任何进程。

结论

在本教程中,我们演示了如何使用强大的工具 CRIU 在 Linux 中执行检查点。我们只做了一个简单的示例,但 CRIU 功能更强大,并且有很多功能等待探索。

更新于: 2024 年 11 月 4 日

40 次查看

启动你的 职业生涯

通过完成课程获得认证

开始
广告