我正在尝试在实例终止之前将日志文件发送到 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
。
一旦启用,服务将在开机时自动启动。一旦启动,它将一直处于待命状态直到关机,关机时它将运行脚本。