Linux

Systemd - 在標準 libvirt-guests.service 之前執行自定義 VM 關閉腳本

  • November 25, 2018

在 KVM 主機上,我有一些帶有不監聽 ACPI 關閉事件的舊版作業系統的虛擬機。就像在 Debian 9.5 主機上發生的那樣,關閉libvirt-guests.service時每個此類 VM 等待 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

Before=聲明涉及服務的啟動。從man systemd.unit.

如果單元 foo.service 包含設置 Before=bar.service 並且兩個單元都在啟動,則 bar.service 的啟動將延遲到 foo.service 完成啟動。

請注意,當兩個具有順序依賴關係的單元關閉時,將應用與啟動順序相反的順序。即,如果一個單元在另一個單元上配置了 After=,如果兩者都關閉,則前者在後者之前停止。

所以你想配置你的服務,After=libvirt-guests.service因為服務在啟動之後libvirt-guests.service啟動,你的服務在停止之前libvirt-guests.service停止。

引用自:https://serverfault.com/questions/941535