Назад | Перейти на главную страницу

Systemd - запуск пользовательского сценария выключения ВМ перед стандартной libvirt-guest.service

На хосте 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 остановлен.