インスタンスを終了する前にログファイルを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
で開始します。
有効にすると、サービスは起動時に自動的に開始されます。開始すると、シャットダウンするまで何もせずに終了し、シャットダウン時にスクリプトを実行します。