深色模式
定时自动化:cron + 脚本做巡检与备份
摘要:巡检和备份是最适合自动化的高频任务。本文讲清 cron 表达式、环境变量陷阱、日志轮转与防重入锁,并给出一份可直接套用的每日备份脚本。
适用环境
- Linux 服务器(cron 由
cronie提供,systemd 系统自带 timer) - 具备 sudo 权限
- 有备份目标目录或远端存储
操作步骤
1. cron 表达式速查
text
┌──────── 分 (0-59)
│ ┌────── 时 (0-23)
│ │ ┌──── 日 (1-31)
│ │ │ ┌── 月 (1-12)
│ │ │ │ ┌ 周 (0-7,0 和 7 都是周日)
* * * * * command1
2
3
4
5
6
2
3
4
5
6
*/5 * * * * 每 5 分钟;0 2 * * * 每天凌晨 2 点;0 9-18 * * 1-5 工作日 9-18 点每小时。
2. 添加任务(务必声明 PATH 并重定向输出)
bash
sudo tee /etc/cron.d/daily-check > /dev/null <<'EOF'
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO=""
0 8 * * * root /opt/scripts/inspect.sh >> /var/log/inspect.log 2>&1
EOF
sudo chmod 644 /etc/cron.d/daily-check1
2
3
4
5
6
7
2
3
4
5
6
7
cron 的 PATH 只有 /usr/bin:/bin,直接用 aws、docker 会 command not found,务必声明 PATH 或用绝对路径(command -v docker 查询)。
3. 每日备份脚本(含锁与保留策略)
bash
sudo cat > /opt/scripts/backup.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
readonly SRC="/var/lib/app" DST="/data/backup" KEEP_DAYS=7 LOG="/var/log/backup.log"
log() { printf '%s [%s] %s\n' "$(date '+%F %T')" "$1" "$2" >> "${LOG}"; }
exec 9>/var/lock/backup.lock
flock -n 9 || { log ERROR "already running"; exit 1; }
mkdir -p "${DST}"
out="${DST}/app-$(date +%Y%m%d-%H%M%S).tar.gz"
log INFO "start backup ${SRC}"
tar -czf "${out}" -C "$(dirname "${SRC}")" "$(basename "${SRC}")" || { log ERROR "failed"; exit 1; }
log INFO "done: ${out}"
find "${DST}" -name 'app-*.tar.gz' -mtime +${KEEP_DAYS} -delete
EOF
sudo chmod +x /opt/scripts/backup.sh1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
4. 日志轮转
bash
sudo tee /etc/logrotate.d/ops-scripts > /dev/null <<'EOF'
/var/log/backup.log /var/log/inspect.log {
daily
rotate 14
compress
missingok
notifempty
copytruncate
}
EOF1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
5. 更现代的替代:systemd timer
bash
sudo tee /etc/systemd/system/backup.timer > /dev/null <<'EOF'
[Unit]
Description=Run backup daily at 02:00
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
EOF
sudo systemctl daemon-reload && sudo systemctl enable --now backup.timer
systemctl list-timers | grep backup1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
优势:Persistent=true 错过的任务开机补跑、日志进 journald。
危险
脚本中的 find ... -delete 一旦 DST 拼错或为空会删错目录。上线前先把 -delete 换成 -print 跑一遍看清单。
验证
bash
sudo /opt/scripts/backup.sh && ls -lh /data/backup | tail -5
grep CRON /var/log/cron1
2
2
- [ ] 手动执行成功并生成 tar.gz
- [ ] cron 到点后
/var/log/cron有执行记录 - [ ] 重复启动第二个实例被锁挡住
常见坑
脚本没加执行权限
cron 报 Permission denied。chmod +x 并检查 shebang。
输出没重定向塞满磁盘
cron 默认把输出邮寄给用户。所有任务都要加 >> /var/log/xxx.log 2>&1。
备份没验证过恢复
只备份不演练恢复等于没备份。建议每月在测试机执行一次完整恢复演练。