systemd 可以在重新启动后保留其状态吗?

systemd 可以在重新启动后保留其状态吗?

我正在建立一个 Linux 服务器,该服务器将有数十个由 systemd 控制的守护进程。守护进程被分组为目标,以便可以按组启动和关闭它们,但系统管理员可以手动控制各个服务。我正在寻找一种通过重新启动来保留状态(激活哪些服务)的方法。这个想法是,人们在服务器上进行调试、测试和开发可以根据需要重新启动服务器,并使系统的配置与重新启动之前相同。

systemd 的snapshot功能似乎对此很理想,但据我所知,您无法将快照写入磁盘以供以后使用。

我最初的计划是创建一个multi-user.target.wants/指向名为 的服务的符号链接bootingup.service。系统管理员激活的每个目标都会重写bootingup.service.d/bootingup.conf以启动刚刚激活的目标。这意味着系统在启动时将激活最近启动的目标,但它不会记住任何单独激活/停用的服务。

有没有办法让 systemd 在重新启动后记住所有服务的状态?

答案1

我将从以下开始回答这个问题:

我建议您强制开发人员在服务中正确使用enabledisableafter和等内容,而不是对正在运行的内容进行转储和恢复。wantssystemd

现在我已经把它从我的系统中删除了......


systemctl snapshot可以帮助您做您正在寻找的事情。

运行时systemctl snapshot ${SNAPSHOT_NAME} systemd会创建一个名为 的单元${SNAPSHOT_NAME}.snapshot。这个单位似乎只存在于记忆中。但是,您仍然可以使用 来查询它systemctl

使用systemctl show ${SNAPSHOT_NAME}.snapshot将列出为快照收集的所有信息systemd,特别值得注意的是Wants=/After=部分(两者似乎相同),其中列出了快照时处于活动状态的所有单元。如果您要解析该列表并将其放入自定义目标中,您可以使用systemctl isolate ${CUSTOM_TARGET}.

systemctl 隔离

启动命令行上指定的单元及其依赖项并停止所有其他单元。如果给出的单元名称没有扩展名,则将假定扩展名为“.target”。

这类似于更改传统 init 系统中的运行级别。 isolate 命令将立即停止新单元中未启用的进程,可能包括您当前正在使用的图形环境或终端。

请注意,仅在启用了AllowIsolate=的设备上才允许这样做。有关详细信息,请参阅 systemd.unit(5)。

${CUSTOM_TARGET} Wants您甚至可以编写一个在关闭时更新/部分的服务After

答案2

我认为你应该使用像 Puppet 或 Ansible 这样的配置管理器来做到这一点,配置管理器是让你的系统保持你想要的方式的最佳方式。 Systemd 快照在重新启动后不会保留。

相关内容