定时任务 Crontab
大约 15 分钟约 4614 字
定时任务 Crontab
简介
Crontab 是 Linux 系统中最常用的定时任务调度工具,它允许用户按照预设的时间间隔自动执行脚本或命令。通过 cron 守护进程,系统可以在指定的时间点周期性地执行各类维护任务,如数据备份、日志清理、系统监控等,是运维工程师日常工作中不可或缺的核心工具。
特点
Crontab 语法详解
基本语法格式
Crontab 的时间表达式由五个字段组成,分别对应分钟、小时、日、月、周:
# 格式说明
# ┌──────── 分钟 (0-59)
# │ ┌────── 小时 (0-23)
# │ │ ┌──── 日 (1-31)
# │ │ │ ┌── 月 (1-12)
# │ │ │ │ ┌ 星期 (0-7, 0和7都代表周日)
# │ │ │ │ │
# * * * * * command常用特殊符号
| 符号 | 含义 | 示例 |
|---|---|---|
* | 任意值 | * * * * * 每分钟执行 |
, | 列举多个值 | 0 8,12,18 * * * 每天8、12、18点执行 |
- | 表示范围 | 0 9-18 * * 1-5 工作日9到18点每小时执行 |
/ | 步长间隔 | */5 * * * * 每5分钟执行 |
语法进阶
# ====== 完整的 Crontab 时间表达式说明 ======
#
# 字段含义:
# ┌───────────── 分钟 (0 - 59)
# │ ┌─────────── 小时 (0 - 23)
# │ │ ┌───────── 日 (1 - 31)
# │ │ │ ┌─────── 月 (1 - 12 或 jan-dec)
# │ │ │ │ ┌───── 星期 (0 - 7 或 sun-sat,0和7都代表周日)
# │ │ │ │ │
# * * * * * 要执行的命令
# ====== 特殊字符串(Cron 预定义) ======
# @reboot 系统启动时执行一次
# @yearly 每年执行一次(等同于 0 0 1 1 *)
# @annually 每年执行一次(等同于 0 0 1 1 *)
# @monthly 每月执行一次(等同于 0 0 1 * *)
# @weekly 每周执行一次(等同于 0 0 * * 0)
# @daily 每天执行一次(等同于 0 0 * * *)
# @midnight 每天午夜执行(等同于 0 0 * * *)
# @hourly 每小时执行一次(等同于 0 * * * *)
# 使用示例
@reboot /usr/local/bin/startup_check.sh
@daily /usr/local/bin/daily_cleanup.sh
@hourly /usr/local/bin/health_check.sh
# ====== 日期和星期的关系 ======
# 注意:日和星期字段如果都指定了具体值,两者是"或"的关系
# 以下示例表示每月1号 或 每周日 执行
0 0 1 * 0 /path/to/command
# 如果要表示"每月1号且是周日"才执行,需要用命令判断
0 0 1 * * [ "$(date +%a)" = "Sun" ] && /path/to/command
# ====== 复杂时间表达式示例 ======
# 每 15 分钟执行一次
*/15 * * * * /path/to/command
# 每隔 2 小时执行一次
0 */2 * * * /path/to/command
# 每月 1 号和 15 号的 0 点执行
0 0 1,15 * * /path/to/command
# 工作日(周一到周五)的 9 点到 18 点,每小时执行
0 9-18 * * 1-5 /path/to/command
# 每天 8:30 执行
30 8 * * * /path/to/command
# 每周日的 23:59 执行
59 23 * * 0 /path/to/command
# 每月最后一天执行(利用 date 命令判断)
0 0 28-31 * * [ "$(date -d +1day +%d)" = "01" ] && /path/to/command
# 每季度第一天执行
0 0 1 1,4,7,10 * /path/to/command
# 每年 6 月 30 日和 12 月 31 日执行
0 0 30 6,12 * /path/to/commandCrontab 常用命令
管理 Crontab 任务
# 编辑当前用户的定时任务
crontab -e
# 查看当前用户的定时任务列表
crontab -l
# 删除当前用户的所有定时任务
crontab -r
# 以指定用户身份编辑定时任务(需要root权限)
crontab -e -u username管理命令详解
# ====== 基本管理 ======
# 编辑当前用户的 crontab(首次会提示选择编辑器)
crontab -e
# 查看当前用户的定时任务
crontab -l
# 删除当前用户的所有定时任务(危险操作!)
crontab -r
# 安全删除(带确认提示)
crontab -i -r
# 以 root 身份编辑指定用户的 crontab
sudo crontab -e -u deploy
sudo crontab -l -u deploy
# ====== 备份与恢复 ======
# 备份当前用户的 crontab
crontab -l > /root/crontab_backup_$(date +%Y%m%d).txt
# 从文件恢复 crontab
crontab /root/crontab_backup_20240101.txt
# 批量备份所有用户的 crontab
for user in $(cut -f1 -d: /etc/passwd); do
crontab -l -u "$user" 2>/dev/null > "/backup/crontab_${user}_$(date +%Y%m%d).txt"
done
# ====== 指定编辑器 ======
# 方法 1:设置环境变量
export EDITOR=vim
crontab -e
# 方法 2:使用 select-editor
select-editor
# 方法 3:临时指定
EDITOR=nano crontab -e查看日志与调试
# 查看cron服务状态
systemctl status crond
# 启动/重启cron服务
systemctl start crond
systemctl restart crond
# 设置cron服务开机自启
systemctl enable crond日志与调试详解
# ====== Cron 服务管理 ======
# CentOS/RHEL 使用 crond
systemctl status crond
systemctl start crond
systemctl stop crond
systemctl restart crond
systemctl enable crond
# Ubuntu/Debian 使用 cron
systemctl status cron
systemctl start cron
systemctl restart cron
# ====== 查看 Cron 日志 ======
# CentOS/RHEL
tail -f /var/log/cron
grep "CRON" /var/log/cron
grep "username" /var/log/cron
# Ubuntu/Debian
tail -f /var/log/syslog | grep CRON
grep CRON /var/log/syslog
# 查看最近的 cron 执行记录
tail -100 /var/log/cron
# 查看特定任务的执行情况
grep "backup.sh" /var/log/cron
# ====== 调试 Crontab 任务 ======
# 方法 1:在 crontab 中添加日志重定向
* * * * * /path/to/script.sh >> /var/log/my_cron.log 2>&1
# 方法 2:在脚本中添加环境变量调试
* * * * * env > /tmp/cron_env.log && /path/to/script.sh >> /var/log/my_cron.log 2>&1
# 方法 3:查看 cron 邮件
# cron 默认将输出通过邮件发送给用户
# 检查本地邮件
mail
# 或查看 /var/spool/mail/username
# 方法 4:设置 MAILTO 变量
MAILTO="admin@example.com"
* * * * * /path/to/script.sh
# 禁止邮件发送
MAILTO=""
* * * * * /path/to/script.sh
# ====== 常见调试步骤 ======
# 1. 确认 cron 服务正在运行
systemctl status crond
# 2. 确认脚本有执行权限
ls -la /path/to/script.sh
chmod +x /path/to/script.sh
# 3. 确认脚本路径使用绝对路径
# crontab 中所有路径必须是绝对路径
which python3 # 获取完整路径
# 4. 确认环境变量
# crontab 执行时的 PATH 非常有限
# 在 crontab 文件开头添加:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SHELL=/bin/bash
# 5. 手动执行脚本验证
/bin/bash /path/to/script.sh实战示例
数据库自动备份
# 每天凌晨2点备份MySQL数据库
0 2 * * * /usr/bin/mysqldump -u root -p'password' mydb > /backup/mysql/mydb_$(date +\%Y\%m\%d).sql 2>> /var/log/mysql_backup.log
# 每周日凌晨3点备份并压缩所有数据库
0 3 * * 0 /usr/bin/mysqldump -u root -p'password' --all-databases | gzip > /backup/mysql/all_$(date +\%Y\%m\%d).sql.gz
# 每天凌晨4点清理超过30天的备份文件
0 4 * * * find /backup/mysql -name "*.sql.gz" -mtime +30 -delete备份脚本完善版
#!/bin/bash
# /usr/local/bin/mysql_backup.sh
# MySQL 自动备份脚本(配合 crontab 使用)
set -euo pipefail
# ====== 配置 ======
MYSQL_HOST="127.0.0.1"
MYSQL_PORT="3306"
MYSQL_USER="root"
MYSQL_PASS="password"
DATABASES="app_db log_db"
BACKUP_DIR="/backup/mysql"
RETENTION_DAYS=30
LOG_FILE="/var/log/mysql_backup.log"
DATE=$(date +%Y%m%d_%H%M%S)
# ====== 日志函数 ======
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" >> "$LOG_FILE"
}
# ====== 创建备份目录 ======
mkdir -p "$BACKUP_DIR"
# ====== 执行备份 ======
log "Starting MySQL backup..."
FAILED=0
for db in $DATABASES; do
BACKUP_FILE="${BACKUP_DIR}/${db}_${DATE}.sql.gz"
if mysqldump -h"$MYSQL_HOST" -P"$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASS" \
--single-transaction --routines --triggers \
"$db" 2>> "$LOG_FILE" | gzip > "$BACKUP_FILE"; then
log "SUCCESS: $db -> $BACKUP_FILE ($(stat -c%s "$BACKUP_FILE") bytes)"
else
log "ERROR: Failed to backup $db"
FAILED=1
fi
done
# ====== 清理过期备份 ======
DELETED=$(find "$BACKUP_DIR" -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete -print | wc -l)
log "Cleaned up $DELETED old backup files"
# ====== 汇总 ======
if [ $FAILED -eq 0 ]; then
log "Backup completed successfully"
else
log "Backup completed with errors"
exit 1
fi
# ====== Crontab 配置 ======
# 每天凌晨 2:00 执行
# 0 2 * * * /usr/local/bin/mysql_backup.sh日志清理与系统维护
# 每天凌晨1点清理超过7天的nginx日志
0 1 * * * find /var/log/nginx -name "*.log" -mtime +7 -exec gzip {} \;
# 每小时清理/tmp目录下超过24小时的临时文件
0 * * * * find /tmp -type f -mtime +1 -delete
# 每天凌晨0点切割nginx日志并发送信号
0 0 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx && systemctl reload nginx
# 每周一凌晨5点清理系统缓存
0 5 * * 1 sync && echo 3 > /proc/sys/vm/drop_caches更多实战示例
# ====== 应用健康检查 ======
# 每 5 分钟检查应用是否存活
*/5 * * * * curl -sf http://localhost:8080/actuator/health > /dev/null 2>&1 || /usr/local/bin/restart_app.sh
# 每 10 分钟检查磁盘空间,超过 90% 发送告警
*/10 * * * * df -h | awk 'NR>1 && int($5) > 90 {print $0}' && echo "Disk alert on $(hostname)" | mail -s "Disk Alert" admin@example.com
# ====== 文件同步 ======
# 每小时同步远程文件
0 * * * * rsync -avz --delete /data/app/ user@backup-server:/backup/app/ >> /var/log/rsync.log 2>&1
# 每天同步到 OSS
0 1 * * * ossutil sync /data/backup/ oss://my-bucket/backup/ --force >> /var/log/oss_sync.log 2>&1
# ====== 证书续期检查 ======
# 每月 1 号检查 SSL 证书有效期
0 0 1 * * /usr/local/bin/check_ssl_cert.sh >> /var/log/ssl_check.log 2>&1
# ====== Docker 清理 ======
# 每天清理 Docker 悬空镜像
0 3 * * * docker image prune -f >> /var/log/docker_cleanup.log 2>&1
# 每周清理 Docker 构建缓存
0 4 * * 0 docker builder prune -af >> /var/log/docker_cleanup.log 2>&1
# ====== Redis 持久化备份 ======
# 每小时备份 Redis RDB 文件
0 * * * * cp /var/lib/redis/dump.rdb /backup/redis/dump_$(date +\%Y\%m\%d_\%H\%M).rdb
# ====== 监控数据采集 ======
# 每 1 分钟采集系统指标
* * * * * /usr/local/bin/collect_metrics.sh >> /var/log/metrics.log 2>&1
# 每 5 分钟检查服务端口连通性
*/5 * * * * for port in 3306 6379 8080 5672; do ss -tlnp | grep -q ":${port} " || echo "$(date) Port $port is down" >> /var/log/port_check.log; done
# ====== 定时任务示例汇总 ======
# ┌─────────────────────────────────────────────────────────────────────┐
# │ 分 时 日 月 周 任务描述 │
# ├─────────────────────────────────────────────────────────────────────┤
# │ */5 * * * * 每5分钟健康检查 │
# │ 0 * * * * 每小时清理临时文件 │
# │ 0 2 * * * 每天凌晨2点数据库备份 │
# │ 0 0 * * * 每天凌晨0点日志切割 │
# │ 0 3 * * 0 每周日凌晨3点全量备份 │
# │ 0 4 1 * * 每月1号凌晨4点清理过期文件 │
# │ */10 * * * * 每10分钟检查磁盘空间 │
# │ 0 */2 * * * 每2小时同步数据 │
# │ 30 8 * * 1-5 工作日每天8:30发送日报 │
# │ 0 0 1,15 * * 每月1号和15号执行结算 │
# └─────────────────────────────────────────────────────────────────────┘Crontab 环境变量与注意事项
# ====== Crontab 中的环境变量问题 ======
# Crontab 执行时的环境非常精简,与用户登录 Shell 环境不同
# Crontab 默认的 PATH 通常只有:
# /usr/bin:/bin
# 如果你的脚本使用了 /usr/local/bin 下的命令,需要手动设置 PATH
# 在 crontab 文件顶部设置环境变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SHELL=/bin/bash
JAVA_HOME=/usr/lib/jvm/java-11
PYTHON_HOME=/usr/local/python3
LANG=zh_CN.UTF-8
LC_ALL=zh_CN.UTF-8
MAILTO=admin@example.com
# ====== Crontab 中的特殊字符转义 ======
# % 在 crontab 中是特殊字符,必须转义为 \%
# 错误写法:
# 0 2 * * * echo $(date +%Y%m%d)
# 正确写法:
0 2 * * * echo $(date +\%Y\%m\%d)
# 或者将命令写入脚本,在 crontab 中调用脚本
# 0 2 * * * /usr/local/bin/daily_task.sh
# ====== Crontab 中的路径问题 ======
# 必须使用绝对路径
# 错误:* * * * * python3 /home/user/script.py
# 正确:* * * * * /usr/bin/python3 /home/user/script.py
# 获取命令的绝对路径
which python3 # /usr/bin/python3
which java # /usr/bin/java
# ====== Crontab 输出处理 ======
# 重定向到日志文件
* * * * * /path/to/script.sh >> /var/log/my_script.log 2>&1
# 同时输出到日志和邮件
* * * * * /path/to/script.sh 2>&1 | tee -a /var/log/my_script.log
# 丢弃所有输出
* * * * * /path/to/script.sh > /dev/null 2>&1
# ====== Crontab 并发控制 ======
# 使用 flock 防止任务重叠执行
# 确保同一时间只有一个实例在运行
* * * * * flock -xn /tmp/my_task.lock /path/to/script.sh >> /var/log/my_task.log 2>&1
# 使用 pidfile 防止并发
* * * * * [ -f /tmp/my_task.pid ] && kill -0 $(cat /tmp/my_task.pid) 2>/dev/null && exit 0; echo $$ > /tmp/my_task.pid; /path/to/script.sh; rm -f /tmp/my_task.pid系统级 Crontab 配置
# ====== /etc/crontab(系统级定时任务) ======
# 格式与用户 crontab 不同,多了一个"用户"字段
# 分 时 日 月 周 用户 命令
cat /etc/crontab
# SHELL=/bin/bash
# PATH=/sbin:/bin:/usr/sbin:/usr/bin
# MAILTO=root
# HOME=/
#
# For details see man 4 crontabs
#
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
# ====== /etc/cron.d/(系统级任务目录) ======
# 可以在该目录下创建独立的 crontab 文件
# 每个文件需要包含用户字段
cat > /etc/cron.d/app-backup << 'EOF'
# 应用备份定时任务
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO=admin@example.com
# 每天凌晨 2 点备份数据库
0 2 * * * app_user /usr/local/bin/mysql_backup.sh
EOF
chmod 644 /etc/cron.d/app-backup
# ====== /etc/cron.daily/ /etc/cron.hourly/ 等目录 ======
# 将脚本放入对应目录,会按照目录名设定的时间执行
# cron.hourly/ - 每小时执行
# cron.daily/ - 每天执行
# cron.weekly/ - 每周执行
# cron.monthly/ - 每月执行
# 创建每日执行脚本
cat > /etc/cron.daily/daily_cleanup.sh << 'EOF'
#!/bin/bash
# 每日清理任务
find /tmp -type f -mtime +1 -delete
find /var/log/app -name "*.log" -mtime +7 -exec gzip {} \;
EOF
chmod +x /etc/cron.daily/daily_cleanup.sh
# 注意:这些目录中的脚本执行时间由 /etc/anacrontab 控制Anacron 替代方案
Anacron 适合非24小时运行的系统,能够在系统启动后补执行错过的定时任务。
# 查看/etc/anacrontab配置文件
cat /etc/anacrontab
# 格式:周期(天) 延迟(分钟) 任务标识 命令
# 1 5 cron.daily nice run-parts /etc/cron.daily
# 7 25 cron.weekly nice run-parts /etc/cron.weekly
# @monthly 45 cron.monthly nice run-parts /etc/cron.monthly
# 将自定义脚本放入每日执行目录
cp /root/scripts/daily_cleanup.sh /etc/cron.daily/
chmod +x /etc/cron.daily/daily_cleanup.sh
# 查看anacron执行时间戳
cat /var/spool/anacron/cron.dailySystemd Timer 替代方案
Systemd timer 提供了比 crontab 更精确的定时控制,支持秒级调度和更多依赖管理。
# 创建service单元文件 /etc/systemd/system/backup.service
cat > /etc/systemd/system/backup.service << 'EOF'
[Unit]
Description=MySQL Backup Service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/mysql_backup.sh
EOF
# 创建timer单元文件 /etc/systemd/system/backup.timer
cat > /etc/systemd/system/backup.timer << 'EOF'
[Unit]
Description=MySQL Backup Timer
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
EOF
# 启用并启动timer
systemctl daemon-reload
systemctl enable backup.timer
systemctl start backup.timer
# 查看所有timer列表
systemctl list-timers --allSystemd Timer 详解
# ====== Timer 的高级配置 ======
# /etc/systemd/system/backup.timer
[Unit]
Description=MySQL Backup Timer
After=network.target mysql.service
[Timer]
# 时间表达式(类似 cron)
OnCalendar=*-*-* 02:00:00
# 如果错过了执行时间,启动后立即补执行
Persistent=true
# 随机延迟(防止多个任务同时执行)
RandomizedDelaySec=10m
# 任务超时时间
OnActiveSec=3h
# 连续执行的最小间隔
AccuracySec=1h
[Install]
WantedBy=timers.target
# ====== OnCalendar 时间表达式 ======
# 每天凌晨 2 点
OnCalendar=*-*-* 02:00:00
# 每小时
OnCalendar=hourly
# 或
OnCalendar=*-*-* *:00:00
# 每周一早上 8 点
OnCalendar=Mon *-*-* 08:00:00
# 每月 1 号
OnCalendar=*-*-01 00:00:00
# 工作日早上 9 点
OnCalendar=Mon..Fri *-*-* 09:00:00
# 每 5 分钟
OnCalendar=*-*-* *:00/5:00
# 每季度第一天
OnCalendar=*-01,04,07,10-01 00:00:00
# 上次运行后 24 小时
OnCalendar=daily
OnCalendar=--24h
# ====== Timer 命令 ======
# 查看所有 timer
systemctl list-timers --all
# 查看特定 timer 的日志
journalctl -u backup.timer -f
# 查看 timer 下次执行时间
systemctl list-timers backup.timer
# 手动触发 timer 对应的 service
systemctl start backup.service
# 查看 timer 状态
systemctl status backup.timer
systemctl status backup.serviceCrontab 与 Systemd Timer 对比
┌────────────────┬──────────────────┬──────────────────┐
│ 特性 │ Crontab │ Systemd Timer │
├────────────────┼──────────────────┼──────────────────┤
│ 最小精度 │ 分钟 │ 秒 │
│ 错过执行 │ 不支持 │ 支持(Persistent)│
│ 依赖管理 │ 不支持 │ 支持 │
│ 日志集成 │ /var/log/cron │ journalctl │
│ 并发控制 │ flock │ 内建 │
│ 权限管理 │ 用户级/系统级 │ 系统级 │
│ 乱序执行 │ 支持 │ 支持 │
│ 环境变量 │ 精简 │ 完整 │
│ 学习成本 │ 低 │ 中 │
│ 生态兼容 │ 所有 Linux │ 现代发行版 │
└────────────────┴──────────────────┴──────────────────┘
选择建议:
- 简单定时任务:使用 Crontab
- 需要依赖管理/错过执行:使用 Systemd Timer
- 需要秒级精度:使用 Systemd Timer
- 兼容旧系统:使用 Crontab优点
缺点
总结
Crontab 作为 Linux 系统中最经典的定时任务工具,凭借简洁的语法和可靠的执行机制,成为运维自动化的基础组件。对于简单的定时任务场景,crontab 是首选方案;对于需要更精细控制的任务调度,可以考虑 systemd timer 作为替代。建议在生产环境中结合日志记录和监控告警,确保定时任务的可靠执行。
关键知识点
- 部署类主题的核心不是"装成功",而是"稳定运行、可排障、可回滚"。
- 同一个服务通常至少要关注版本、目录、端口、权限、数据、日志和备份。
- Linux 问题经常跨越系统层、网络层、服务层和应用层。
- Crontab 中 % 是特殊字符,必须转义为 %。
- Crontab 执行环境与用户 Shell 环境不同,PATH 非常有限。
- Crontab 中所有路径必须使用绝对路径。
- 使用 flock 可以防止定时任务重叠执行。
- Crontab 的日和星期字段是"或"的关系。
项目落地视角
- 把安装步骤补成可重复执行的清单,必要时写成脚本或配置文件。
- 把配置目录、数据目录、日志目录和挂载点明确拆开。
- 上线前检查防火墙、SELinux、时区、磁盘、系统服务和健康检查。
- 所有定时任务脚本加入日志记录和错误处理。
- 定时任务不要直接写复杂命令,封装为脚本文件。
常见误区
- 使用 latest 或未固定版本,导致环境不可复现。
- 只验证启动成功,不验证持久化、开机自启和故障恢复。
- 遇到问题先改配置而不是先看日志和依赖链路。
- 在 crontab 中使用相对路径或不转义 % 字符。
- 不设置 PATH 导致脚本找不到命令。
- 不添加日志重定向,任务失败无法排查。
- 不使用 flock 导致任务重叠执行。
- 忘记给脚本添加执行权限。
进阶路线
- 继续补齐 systemd、性能监控、安全加固和备份恢复。
- 把单机操作升级成 Docker、Kubernetes 或 IaC 方案。
- 建立标准化运维手册,包括巡检、扩容、回滚和灾备演练。
- 学习 Ansible 等工具实现跨主机定时任务管理。
- 研究分布式任务调度框架如 Airflow、XXL-JOB。
适用场景
- 当你准备把《定时任务 Crontab》真正落到项目里时,最适合先在一个独立模块或最小样例里验证关键路径。
- 适合单机环境初始化、中间件快速搭建、测试环境验证和生产部署前准备。
- 当服务稳定性依赖端口、权限、目录、网络和系统参数时,这类主题会直接影响成败。
落地建议
- 固定版本号与镜像标签,避免"latest"带来的不可预期变化。
- 把配置、数据、日志目录拆开管理,并记录恢复步骤。
- 上线前确认端口、防火墙、SELinux、时区和磁盘空间。
- 所有定时任务脚本纳入版本控制。
- 建立定时任务监控和告警机制。
排错清单
- 先查 systemctl、容器日志和应用日志,确认失败发生在哪一层。
- 检查端口占用、目录权限、挂载路径和网络连通性。
- 如果是新环境问题,优先对比与已知正常环境的差异。
- 检查 crontab 语法是否正确(crontab 文件末尾要有换行)。
- 检查 cron 服务是否运行(systemctl status crond)。
- 检查脚本权限和环境变量。
复盘问题
- 如果把《定时任务 Crontab》放进你的当前项目,最先要验证的输入、输出和失败路径分别是什么?
- 《定时任务 Crontab》最容易在什么规模、什么边界条件下暴露问题?你会用什么指标或日志去确认?
- 相比默认实现或替代方案,采用《定时任务 Crontab》最大的收益和代价分别是什么?
