Я пытаюсь отправить файлы журнала на S3 до завершения работы экземпляра. Я создал файл .service в /lib/systemd/system-shutdown/upload-backup.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
.
После включения служба будет запускаться автоматически при загрузке. После запуска он будет сидеть и ничего не делать до завершения работы, а при завершении работы запустит сценарий.