Назад | Перейти на главную страницу

Запустить сценарий резервного копирования при завершении работы systemd (например, копировать журналы на S3 перед завершением работы экземпляра с помощью автоматического масштабирования)

Я пытаюсь отправить файлы журнала на 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.

После включения служба будет запускаться автоматически при загрузке. После запуска он будет сидеть и ничего не делать до завершения работы, а при завершении работы запустит сценарий.