必须用 timer + service 组合,因 mysqldump 脚本是短时任务,systemd service 单元仅适用于长期运行的守护进程;若直接作为 service 运行,执行完即标记为 inactive (dead),无法通过 systemctl status 获取真实执行结果。

不能直接用 systemd 监控 mysqldump 脚本的“执行状态”——它不是长期运行的服务,而是短时任务。必须改用 timer + service 组合,否则 systemctl status 永远显示 inactive (dead)。
为什么 backup.sh 不能当普通 service 运行
systemd 的 service 单元默认用于守护进程(如 mysqld),要求进程长期驻留。而备份脚本执行完就退出,systemd 会立刻标记为 inactive (dead),systemctl status backup.service 看不到“成功/失败”的实时结果,只反映最后一次退出码。
- 执行后立即退出 → systemd 认为服务已“终止”,不提供运行中状态
- 无法用
systemctl is-active backup.service判断“今天是否已备份” - 日志会被归档到 journal 中,但没有结构化状态字段供脚本轮询
正确做法:用 .timer 触发 .service,再查 journal 或 exit code
把备份逻辑封装为 backup.service,再配一个 backup.timer 定时触发。真正检查执行结果,靠的是 journalctl 和 systemctl show --property=ExecMainStatus。
- 创建
/etc/systemd/system/backup.service:[Unit] Description=MySQL Daily Backup After=network.target mysqld.service <p>[Service] Type=oneshot User=root Group=root ExecStart=/usr/local/bin/mysql_backup.sh RemainAfterExit=yes StandardOutput=journal StandardError=journal</p><p>[Install] WantedBy=multi-user.target</p>
- 创建
/etc/systemd/system/backup.timer:[Unit] Description=Run MySQL backup daily at 02:00 <p>[Timer] OnCalendar=<em>-</em>-* 02:00:00 Persistent=true</p><p>[Install] WantedBy=timers.target</p>
- 启用并启动:
systemctl daemon-reload→systemctl enable backup.timer→systemctl start backup.timer
怎么确认某次备份是否真的成功了
别信 systemctl status backup.service 的 “active (exited)” —— 它只说明脚本跑完了,不说明 mysqldump 成功。必须查 exit code 或日志关键词。
- 查最近一次执行的退出码:
systemctl show backup.service --property=ExecMainStatus | cut -d= -f2,返回0才算成功 - 查是否生成了压缩包:
journalctl -u backup.service --since "1 day ago" | grep "backup completed" - 查
mysqldump是否报错:journalctl -u backup.service -n 20 | grep -i "error\|warning" - 注意:如果脚本里没写
set -e或显式exit 1,即使mysqldump失败,整个脚本也可能返回 0
容易被忽略的关键点
最常出问题的地方不在配置,而在脚本本身和权限链:
-
mysql_backup.sh必须有可执行权限:chmod +x /usr/local/bin/mysql_backup.sh - 脚本里不能用
sudo——systemd以User=root运行,但sudo会因无 TTY 拒绝执行 -
mysqldump连接 MySQL 时若用密码,不要写在命令行(-p$PASSWORD),会被ps看见;改用~/.my.cnf并设chmod 600 -
backup.service中的RemainAfterExit=yes是必须的,否则systemctl is-active backup.service永远返回inactive











