web-dev-qa-db-ja.com

systemdのシャットダウン時にバックアップスクリプトを実行します(例:自動スケーリングでインスタンスを終了する前にログをS3にコピーします)

インスタンスを終了する前にログファイルをS3に送信しようとしています。 /lib/systemd/system-shutdown/upload-backup.serviceに.serviceファイルを作成しました。これはこれです。

Description=Testing
Before=shutdown.target reboot.target halt.target
Requires=network-online.target network.target
DefaultDependencies=no
[Service]
ExecStart=/bin/true
ExecStop=/home/ubuntu/upload_log_to_s3.sh
RemainAfterExit=yes
Type=oneshot
[Install]
WantedBy=multi-user.target

注:upload_log_to_s3は、ホームに存在し、ファイルをコピーするスクリプトです。これは独立して動作しているため、問題はありません。

また、このファイルのソフトリンクを/etc/systemd/system/shutdown.target.wants/に作成し、systemctlも有効にしました。

ただし、シャットダウンまたは再起動中はスクリプトは実行されません。間違いとどこが間違っているのか説明してください。

私にとってうまくいったトリックは、サービスユニットのExecStop=を使用してスクリプトを実行することでしたが、サービスユニットはそれ以外は「通常」、つまりWantedBy=multi-user.targetです。

コマンドの実行時にネットワークが引き続き使用可能であることを確認するために、After=network.targetを追加しました。

関心のある特定のサービスによって生成されるログファイルに関心があるため、対象のサービスが停止した後でのみコマンドが実行されるように、Before=interesting.serviceを追加しました。

ユニットを停止するとき、systemdはBefore=After=の順序の依存関係を逆に適用するため、上記は意図したとおりであることに注意してください。

また、User=およびGroup=も設定して、スクリプトがrootとして実行されないようにします。

[Unit]
Before=interesting.service
After=network.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStop=/home/ubuntu/upload_log_to_s3.sh
User=ubuntu
Group=ubuntu
[Install]
WantedBy=multi-user.target

ファイルを/etc/systemd/system/upload-backup.service;に配置します。有効にして、Sudo systemctl enable upload-backup.service --nowで開始します。

有効にすると、サービスは起動時に自動的に開始されます。開始すると、シャットダウンするまで何もせずに終了し、シャットダウン時にスクリプトを実行します。

3
Amir