在 KVM 主机上,我有几个虚拟机,它们运行的是旧版操作系统,不会监听 ACPI 关机事件。就像 Debian 9.5 主机上的情况一样,关机时,libvirt-guests.service
每个这样的虚拟机都会等待 5 分钟,然后销毁它。
为了避免这种情况并彻底关闭它们,我创建了自定义 VM 关闭服务,并使用特殊方法关闭它们的脚本:
% cat /etc/systemd/system/multi-user.target.wants/vm_stop.service
[Unit]
Description=vm_shutdown
Before=libvirt-guests.service
[Service]
ExecStart=/bin/true
ExecStop=/usr/local/bin/vm_shutdown_all.sh
[Install]
WantedBy=multi-user.target
然而,在关闭时,该服务似乎运行后 libvirt-guests.service
尽管Before=
上述服务有这样的设置。
现在,我已经测试了自定义服务是否确实在关机时运行 - 它touch
是一个我可以验证它的测试文件。
问题:我如何确保它在之前运行libvirt-guests.service
?
答案1
该Before=
声明与该服务的启动有关。来自man systemd.unit
。
如果单元 foo.service 包含设置 Before=bar.service 并且两个单元都正在启动,则 bar.service 的启动将被延迟,直到 foo.service 完成启动。...
请
注意,当两个相互之间存在顺序依赖关系的单元关闭时,将应用启动顺序的逆转。即,如果一个单元在另一个单元上配置了 After=,则如果两个单元都关闭,则前者将在后者之前停止。
因此,您需要将您的服务配置为在启动After=libvirt-guests.service
之后启动该服务,并在停止之前停止该服务。libvirt-guests.service
libvirt-guests.service