web-dev-qa-db-ja.com

systemdのシャットダウン時に他のすべての前にスクリプトを実行するにはどうすればよいですか?

注:簡単に作成された質問は下部にあります。

ファイルを外部USBドライブにバックアップするスクリプトがあります。作成した新しいデータの量によっては、実行にしばらく時間がかかる場合があります。システムをシャットダウンするたびに自動的に実行したい。

Fedora 23を最新のアップデート(systemd)で使用しています。

私はいくつかの方法でこれを達成しようとしましたが、それを機能させることができませんでした。

StopExecを使用した長時間実行プロセス

autobackup.service:

[Unit]
Description=Slow backup script
Requires=local-fs.target

[Service]
ExecStart=/bin/true
ExecStop=/etc/systemd/system/do_backup.sh
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multiuser.target

systemctl enable autobackup.servicesystemctl start autobackup.service

ブートログの一部(journalctl -b-1):

Dez 22 17:45:27 localhost systemd[1]: Unmounted /mnt/BACKUP.
Dez 22 17:45:27 localhost do_backup.sh[4296]: At subvol /home/BACKUP.2015_12_22-17_45_25
Dez 22 17:45:27 localhost do_backup.sh[4296]: ERROR: parent subvol is not reachable from inside the root subvol.
Dez 22 17:45:27 localhost do_backup.sh[4296]: At snapshot BACKUP.2015_12_22-17_45_25
Dez 22 17:45:27 localhost do_backup.sh[4296]: ERROR: failed to dump stream. Broken pipe
Dez 22 17:45:27 localhost systemd[1]: autobackup.service: Control process exited, code=exited status=1
Dez 22 17:45:27 localhost systemd[1]: Stopped Slow backup script.
Dez 22 17:45:27 localhost systemd[1]: autobackup.service: Unit entered failed state.

間を短くしたわけではないことに注意してください。スクリプトが開始する直前に/ mnt/BACKUPが実際にアンマウントされました。

Shutdown.targetの前

autobackup.service:

[Unit]
Description=Slow backup script
DefaultDependencies=no
Before=shutdown.target

[Service]
ExecStart=/etc/systemd/system/do_backup.sh
Type=oneshot

systemctl edit shutdown.target

[Unit]
Requires=autobackup.service

出力は基本的に同じです。

問題

問題は、両方の場合にsystemdが他のすべてのシャットダウンスクリプトと並行してスクリプトを開始することだと思います。これにより、BACKUPがアンマウントされ、パイプインフラストラクチャが非アクティブになります(アンマウントが十分に高速でない場合に、別のエラーが発生することがあります)。

質問

最初にシャットダウン時にスクリプトを開始し、スクリプトが終了するまで待ってから、残りのシャットダウンスクリプト/ターゲット/ユニット/その他を開始するようにsystemdにどのように教えることができますか?

18
le_me

わかった!

解決策StopExecを使用した長時間実行プロセスを変更し、次のように変更します。

autobackup.service:

[Unit]
Description=Slow backup script
RequiresMountsFor=/mnt/BACKUP /home

[Service]
ExecStop=/etc/systemd/system/do_backup.sh
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

次の行に注意してください。

RequiresMountsFor=/mnt/BACKUP /home

このように期待どおりに動作します。

11
le_me

サービスファイルを作成または編集する必要はありません。スクリプトをドロップするだけです

/usr/lib/systemd/system-shutdown/

https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html

実際のシステムを実行する直前にhalt/poweroff/reboot/kexec systemd-shutdownはすべての実行可能ファイルを/ usr/lib/systemd/system-shutdown /で実行し、それらに1つの引数を渡します: "halt"、 "poweroff"、 "reboot選択したアクションに応じて、 "または" kexec "。このディレクトリ内のすべての実行可能ファイルは並行して実行され、すべての実行可能ファイルが終了するまでアクションの実行は継続されません。

PCスピーカーのビープ音を鳴らすために使用します。

13
Joost