На хосте KVM у меня есть несколько виртуальных машин с устаревшими ОС, которые не прослушивают событие выключения ACPI. Как это происходит на хосте Debian 9.5, при выключении libvirt-guests.service
ожидает 5 минут для каждой такой виртуальной машины, а затем уничтожает ее.
Чтобы избежать этого и аккуратно выключить их, я создал собственную службу выключения виртуальных машин со сценарием, который использует специальные методы для их выключения:
% 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
?
В Before=
Заявление относится к запуску службы. Из man systemd.unit
.
Если модуль foo.service содержит параметр Before = bar.service и оба модуля запускаются, запуск bar.service откладывается до тех пор, пока foo.service не завершит запуск.
...
Обратите внимание, что при отключении двух блоков с зависимостью порядка их включения применяется обратный порядку запуска. то есть, если блок настроен с помощью After = на другом блоке, первый останавливается раньше второго, если оба отключены.
Итак, вы хотите настроить свой сервис с помощью After=libvirt-guests.service
поскольку служба запускается после libvirt-guests.service
запущен, и ваша служба остановлена до libvirt-guests.service
остановлен.