在 systemd 关闭时运行备份脚本(例如,通过自动缩放在实例终止之前将日志复制到 S3)

在 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。

但是关机或重启时脚本不会运行。请解释错误以及我错在哪里。

答案1

对我有用的技巧是使用服务单元来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;enable 并使用 启动它sudo systemctl enable upload-backup.service --now

一旦启用,服务将在开机时自动启动。一旦启动,它将一直处于待命状态直到关机,关机时它将运行脚本。

相关内容