![Systemd - 在标准 libvirt-guests.service 之前运行自定义 VM 关闭脚本](https://linux22.com/image/730117/Systemd%20-%20%E5%9C%A8%E6%A0%87%E5%87%86%20libvirt-guests.service%20%E4%B9%8B%E5%89%8D%E8%BF%90%E8%A1%8C%E8%87%AA%E5%AE%9A%E4%B9%89%20VM%20%E5%85%B3%E9%97%AD%E8%84%9A%E6%9C%AC.png)
在 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