主题
15 · 运维脚本:备份、清理与定时任务
目标:写出
backup-lab.sh/cleanup-logs.sh,并用 cron 定时执行(systemd timer 半页对照)。
前置:14 · 健康检查
1. 环境前提
bash
mkdir -p ~/lab/scripts ~/lab/logs ~/lab/backups1
本篇不展开邮件告警;失败靠退出码 + 日志文件。
2. backup-lab.sh
打包 ~/lab(排除 backups 自身,避免套娃):
bash
cat > ~/lab/scripts/backup-lab.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
LAB_ROOT="${LAB_ROOT:-$HOME/lab}"
BACKUP_DIR="${BACKUP_DIR:-$LAB_ROOT/backups}"
STAMP="$(date +%Y%m%d-%H%M%S)"
OUT="$BACKUP_DIR/lab-${STAMP}.tar.gz"
LOG_FILE="${LOG_FILE:-$LAB_ROOT/logs/backup.log}"
mkdir -p "$BACKUP_DIR" "$(dirname "$LOG_FILE")"
{
echo "$(date -Is) start backup -> $OUT"
tar -czf "$OUT" \
--exclude="$BACKUP_DIR" \
-C "$(dirname "$LAB_ROOT")" \
"$(basename "$LAB_ROOT")"
ls -lh "$OUT"
echo "$(date -Is) done"
} | tee -a "$LOG_FILE"
EOF
chmod 755 ~/lab/scripts/backup-lab.sh
~/lab/scripts/backup-lab.sh
ls -lh ~/lab/backups/1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
3. cleanup-logs.sh
删除 N 天前的日志与过期备份(默认 7 天):
bash
cat > ~/lab/scripts/cleanup-logs.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
LAB_ROOT="${LAB_ROOT:-$HOME/lab}"
LOG_DIR="${LOG_DIR:-$LAB_ROOT/logs}"
BACKUP_DIR="${BACKUP_DIR:-$LAB_ROOT/backups}"
KEEP_DAYS="${KEEP_DAYS:-7}"
LOG_FILE="${LOG_FILE:-$LOG_DIR/cleanup.log}"
mkdir -p "$LOG_DIR" "$BACKUP_DIR"
{
echo "$(date -Is) cleanup older than ${KEEP_DAYS} days"
find "$LOG_DIR" -type f -name '*.log' -mtime +"$KEEP_DAYS" -print -delete || true
find "$BACKUP_DIR" -type f -name 'lab-*.tar.gz' -mtime +"$KEEP_DAYS" -print -delete || true
echo "$(date -Is) cleanup done"
} | tee -a "$LOG_FILE"
EOF
chmod 755 ~/lab/scripts/cleanup-logs.sh
KEEP_DAYS=7 ~/lab/scripts/cleanup-logs.sh1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-mtime +7:修改时间在 7 天之前。练习时可先 touch -d '10 days ago' ~/lab/logs/old.log 再跑,确认被删。
4. 主线:cron
bash
crontab -e1
示例(路径换成你的家目录绝对路径;whoami 与 $HOME 以实际为准):
cron
# 每 5 分钟健康检查
*/5 * * * * /home/YOUR_USER/lab/scripts/healthcheck.sh >>/home/YOUR_USER/lab/logs/cron-health.log 2>&1
# 每天 03:15 备份
15 3 * * * /home/YOUR_USER/lab/scripts/backup-lab.sh >>/home/YOUR_USER/lab/logs/cron-backup.log 2>&1
# 每天 04:00 清理
0 4 * * * /home/YOUR_USER/lab/scripts/cleanup-logs.sh >>/home/YOUR_USER/lab/logs/cron-cleanup.log 2>&11
2
3
4
5
6
7
8
2
3
4
5
6
7
8
bash
crontab -l
# 看系统是否跑 cron
sudo systemctl status cron # Debian/Ubuntu 常见服务名1
2
3
2
3
要点:
- cron 里用 绝对路径
- 环境变量极少:需要的在脚本内设默认值(如已做)
healthcheck.sh若需sudo:先解决 NOPASSWD 或改用 root crontab(练习机慎用)
5. 对照:systemd timer(半页)
适合「跟 systemd 统一管理」时;本系列验收以 cron 为准。
bash
# /etc/systemd/system/lab-backup.service
# [Service]
# Type=oneshot
# ExecStart=/home/YOUR_USER/lab/scripts/backup-lab.sh
# User=YOUR_USER
#
# /etc/systemd/system/lab-backup.timer
# [Timer]
# OnCalendar=*-*-* 03:15:00
# Persistent=true
# [Install]
# WantedBy=timers.target
#
# sudo systemctl daemon-reload
# sudo systemctl enable --now lab-backup.timer
# systemctl list-timers1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
6. 系列收束(11~15)
你现在应能:
text
写带严格模式的 Bash → 参数/条件/函数
→ 探活失败自动重启 → 备份与清理 → cron 定时1
2
2
与 01~10 合起来:命令行排查 + 脚本自动化,覆盖一台 Ubuntu 练习机的日常闭环。
7. 动手清单
- [ ]
backup-lab.sh生成~/lab/backups/lab-*.tar.gz - [ ] 造一个「10 天前」的假日志,确认
cleanup-logs.sh删掉它 - [ ]
crontab -e至少加入健康检查一行;crontab -l能看到 - [ ] 等一个周期或临时改成
*/1 * * * *验证后改回(避免刷屏)
8. 常见翻车
| 翻车 | 处理 |
|---|---|
| cron 没跑 | 查 cron 服务;看邮件/cron-*.log;路径是否绝对 |
tar 把 backups 打进自身越来越大 | 保持 --exclude |
find -delete 路径写错 | 先 -print 不带 -delete 干跑 |
| 相对路径在 cron 失败 | 脚本内用 $HOME / 绝对路径 |
9. 官方入口
man crontab、man 5 crontab、man find、man tar- systemd.timer
- Bash manual
回到目录:linux/README.md。
