温馨提示×

Debian 定时器如何备份和恢复

小樊
44
2025-12-18 18:55:33
栏目: 智能运维

Debian 定时器备份与恢复指南

一 适用范围与准备

  • Debian 常见两类定时器:
    • cron:用户级通过 crontab -e,系统级在 /etc/crontab/etc/cron.d/,以及 /etc/cron.hourly|daily|weekly|monthly 目录。
    • systemd timers:成对单元 .timer/.service,配置位于 /etc/systemd/system//lib/systemd/system/
  • 建议准备:
    • 备份与恢复尽量使用具有 rootsudo 权限的账户。
    • 统一备份时间戳,便于追溯与回滚。
    • 恢复前先停启相关单元,避免并发冲突;恢复后校验状态与日志。

二 备份与恢复步骤

  • cron 用户级(当前用户)
    • 备份:crontab -l > crontab_USER_$(date +%F).bak
    • 恢复:crontab crontab_USER_YYYY-MM-DD.bak
    • 校验:crontab -l;如需查看系统级与 cron.d:cat /etc/crontab;ls /etc/cron.d;日志:grep CRON /var/log/syslog
  • cron 指定用户(需 root)
    • 备份:crontab -u USER -l > crontab_USER_$(date +%F).bak
    • 恢复:crontab -u USER crontab_USER_YYYY-MM-DD.bak
  • cron 系统级与目录
    • 备份:tar czf cron_system_$(date +%F).tgz -C /etc cron.d /etc/crontab /etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly
    • 恢复:tar xzf cron_system_YYYY-MM-DD.tgz -C /
  • systemd timers(成对单元)
    • 备份清单:systemctl list-timers --all --no-legend > timers_$(date +%F).txt
    • 备份单元文件:tar czf systemd_timers_$(date +%F).tgz -C /etc/systemd/system/ --wildcards ‘.timer’ '.service’
    • 恢复单元文件:tar xzf systemd_timers_YYYY-MM-DD.tgz -C /etc/systemd/system/
    • 恢复后重载并启用:systemctl daemon-reload;systemctl enable --now NAME.timer
    • 校验:systemctl list-timers --all;systemctl status NAME.timer;journalctl -u NAME.timer -b

三 一键备份脚本示例

  • 保存为 backup_timers.sh,执行:chmod +x backup_timers.sh && ./backup_timers.sh
  • 脚本内容:
#!/usr/bin/env bash
set -Eeuo pipefail

BACKUP_DIR="${1:-/backup/timers}"
TIMESTAMP=$(date +"%Y%m%d%H%M%S")
mkdir -p "$BACKUP_DIR"

# 1) cron:用户级(当前用户)
crontab -l > "$BACKUP_DIR/crontab_$(whoami)_${TIMESTAMP}.bak" 2>/dev/null || true

# 2) cron:系统级与目录
tar czf "$BACKUP_DIR/cron_system_${TIMESTAMP}.tgz" -C /etc cron.d /etc/crontab \
  /etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly 2>/dev/null || true

# 3) systemd:清单
systemctl list-timers --all --no-legend > "$BACKUP_DIR/timers_${TIMESTAMP}.txt" 2>/dev/null || true

# 4) systemd:单元文件(.timer/.service)
tar czf "$BACKUP_DIR/systemd_timers_${TIMESTAMP}.tgz" \
  -C /etc/systemd/system/ --wildcards '*.timer' '*.service' 2>/dev/null || true

# 5) 可选:某个 timer 的日志(按需取消注释并替换 NAME)
# journalctl -u NAME.timer -b > "$BACKUP_DIR/NAME_timer_${TIMESTAMP}.log" 2>/dev/null || true

echo "Backup completed at $TIMESTAMP -> $BACKUP_DIR"
  • 恢复时按顺序执行:
    • 系统级 cron:tar xzf cron_system_YYYYMMDDHHMMSS.tgz -C /
    • systemd 单元:tar xzf systemd_timers_YYYYMMDDHHMMSS.tgz -C /etc/systemd/system/ && systemctl daemon-reload && systemctl enable --now NAME.timer
    • 用户级 cron:crontab crontab_USER_YYYY-MM-DD.bak
    • 校验:crontab -l;systemctl list-timers --all;journalctl -u NAME.timer -b

四 验证与常见问题

  • 验证要点
    • cron:crontab -l;系统级:cat /etc/crontab、ls /etc/cron.d;日志:grep CRON /var/log/syslog
    • systemd:systemctl list-timers --all;systemctl status NAME.timer;journalctl -u NAME.timer -b
  • 常见问题与处理
    • 权限不足:备份/恢复 cron 需对应用户或 root;systemd 单元需 root。
    • 恢复后未触发:确认已执行 systemctl daemon-reload 与 enable --now;检查 OnCalendar/AccuracySec 等配置。
    • 路径或用户不一致:跨机器迁移时,脚本中的 PATH、用户、绝对路径 可能需要调整。
    • 日志缺失:Debian 上 cron 日志通常在 /var/log/syslog,可用 grep CRON 检索。

0