我正在建立一个 Linux 服务器,该服务器将有数十个由 systemd 控制的守护进程。守护进程被分组为目标,以便可以按组启动和关闭它们,但系统管理员可以手动控制各个服务。我正在寻找一种通过重新启动来保留状态(激活哪些服务)的方法。这个想法是,人们在服务器上进行调试、测试和开发可以根据需要重新启动服务器,并使系统的配置与重新启动之前相同。
systemd 的snapshot
功能似乎对此很理想,但据我所知,您无法将快照写入磁盘以供以后使用。
我最初的计划是创建一个multi-user.target.wants/
指向名为 的服务的符号链接bootingup.service
。系统管理员激活的每个目标都会重写bootingup.service.d/bootingup.conf
以启动刚刚激活的目标。这意味着系统在启动时将激活最近启动的目标,但它不会记住任何单独激活/停用的服务。
有没有办法让 systemd 在重新启动后记住所有服务的状态?
答案1
我将从以下开始回答这个问题:
我建议您强制开发人员在服务中正确使用enable
、disable
、after
和等内容,而不是对正在运行的内容进行转储和恢复。wants
systemd
现在我已经把它从我的系统中删除了......
systemctl snapshot
可以帮助您做您正在寻找的事情。
运行时systemctl snapshot ${SNAPSHOT_NAME}
systemd
会创建一个名为 的单元${SNAPSHOT_NAME}.snapshot
。这个单位似乎只存在于记忆中。但是,您仍然可以使用 来查询它systemctl
。
使用systemctl show ${SNAPSHOT_NAME}.snapshot
将列出为快照收集的所有信息systemd
,特别值得注意的是Wants=
/After=
部分(两者似乎相同),其中列出了快照时处于活动状态的所有单元。如果您要解析该列表并将其放入自定义目标中,您可以使用systemctl isolate ${CUSTOM_TARGET}
.
启动命令行上指定的单元及其依赖项并停止所有其他单元。如果给出的单元名称没有扩展名,则将假定扩展名为“.target”。
这类似于更改传统 init 系统中的运行级别。 isolate 命令将立即停止新单元中未启用的进程,可能包括您当前正在使用的图形环境或终端。
请注意,仅在启用了AllowIsolate=的设备上才允许这样做。有关详细信息,请参阅 systemd.unit(5)。
${CUSTOM_TARGET}
Wants
您甚至可以编写一个在关闭时更新/部分的服务After
。
答案2
我认为你应该使用像 Puppet 或 Ansible 这样的配置管理器来做到这一点,配置管理器是让你的系统保持你想要的方式的最佳方式。 Systemd 快照在重新启动后不会保留。