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


17

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

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

最新の更新(systemd)でfedora 23を使用しています。

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

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.service、で開始しましたsystemctl 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に教えるにはどうすればよいですか?

回答:


12

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

/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 /内のすべての実行可能ファイルを実行し、「halt」、「poweroff」、「reboot」のいずれかの引数を渡します選択したアクションに応じて、「」または「kexec」。このディレクトリ内のすべての実行可能ファイルは並行して実行され、すべての実行可能ファイルが終了するまでアクションの実行は継続されません。

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


2
このディレクトリを作成する必要がありましたか?Ubuntu 16.04とRaspbian(jessie)のどちらにもありません。両方ともsystemdベースです。
WoJ

2
Debianシステムは異なるパスを使用します/lib/systemd/system-shutdown/。さらに、これらのスクリプトは、ファイルシステムが既に読み取り専用でマウントされた後、シャットダウンの非常に遅く実行されることに注意してください。そのため、読み取り/書き込み(mount -oremount,rw /)として再マウントしない限り、ファイルシステムへの書き込みアクセスは失敗します。再起動またはシャットダウン時に/ usr / lib / systemd / system-shutdown /のスクリプトを実行する方法を
フランクブライトリング

9
OPは、シャットダウン時に「他のすべての前に」実行されるスクリプトを要求しました。システムシャットダウンスクリプトは、カーネルを強制終了する直前に、他のすべての後に実行されます。
グレッグアレクサンダー

11

わかった!

ソリューション取る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

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


2
する必要はありませんsystemctl editsystemctl enable autobackup同じ効果があり、より慣用的であり[Install]、ユニットにすでにセクションがあるので機能するはずです。ただし、ターゲット名のタイプミスを修正する必要があります。;)
ステファンマジェフスキー

OMGドライブをアンマウントする前にバックアップスクリプトを呼び出す解決策を探していました。ありがとうございました!
ディーンレジン

2
これは私には機能しません。マウントがありません。他のユニットがシャットダウンする前にスクリプトが実行されることを確認したいだけです。
2rs2ts
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.