web-dev-qa-db-ja.com

Systemd-標準のlibvirt-guests.serviceの前にカスタムVMシャットダウンスクリプトを実行する

KVMホストでは、ACPIシャットダウンイベントをリッスンしないレガシーOSを備えたVMがいくつかあります。Debian9.5ホストで発生するように、シャットダウン時にlibvirt-guests.serviceは5分間待機します。そのようなVM)ごとに、それを破棄します。

これを回避してクリーンにシャットダウンするために、特別なメソッドを使用してシャットダウンするスクリプトを使用して、カスタム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設定にもかかわらず、サービスは実行されているように見えますafterBefore=

これで、カスタムサービスが実際にシャットダウン時に実行されることをテストしました。これは、検証できるテストファイルをtouchesします。

問題:libvirt-guests.serviceの前に実行されるようにするにはどうすればよいですか?

1
LetMeSOThat4U

Before=ステートメントは、サービスの開始に関連しています。 man systemd.unitから。

ユニットfoo.serviceにBefore = bar.serviceの設定が含まれていて、両方のユニットが開始されている場合、bar.serviceの起動は、foo.serviceの起動が完了するまで遅延されます。
.。
順序に依存する2つのユニットがシャットダウンされると、起動順序の逆が適用されることに注意してください。つまり、ユニットが別のユニットでAfter =で構成されている場合、両方がシャットダウンされると、前者は後者の前に停止されます。

したがって、After=libvirt-guests.serviceが開始された後にサービスが開始され、libvirt-guests.serviceが停止される前にサービスが停止されるため、libvirt-guests.serviceを使用してサービスを構成する必要があります。

1
Thomas