Linux 计划任务 cron 命令详解 ⏰
📖 目录导航
一、✨ cron 服务特点
⏰ 精准定时 : 支持分钟级精度的任务调度
👥 多用户支持 : 每个用户可拥有独立的任务列表
📝 灵活配置 : 支持复杂的时间表达式和条件执行
📊 日志记录 : 完整的执行日志便于排查问题
🔒 安全可控 : 支持权限管理和访问控制
🔄 稳定可靠 : 系统级守护进程,长期稳定运行
🤔 二、cron 是什么?
组件
作用
位置
crond
后台守护进程,任务调度核心
/usr/sbin/crond
crontab
用户任务配置文件
/var/spool/cron/
系统cron
系统级任务配置
/etc/crontab
定时目录
按周期执行的脚本目录
/etc/cron.daily/
, /etc/cron.hourly/
等
🔍 crond 进程管理 1 2 3 4 5 6 7 8 9 10 11 sudo systemctl status cron sudo systemctl status crond sudo systemctl start cronsudo systemctl stop cronsudo systemctl restart cronsudo systemctl enable cron
🕒 三、时间格式详解 📊 基本时间格式 1 2 3 4 5 6 7 ┌─ 分钟 (0 -59 ) │ ┌─ 小时 (0 -23 ) │ │ ┌─ 日 (1 -31 ) │ │ │ ┌─ 月 (1 -12 ) │ │ │ │ ┌─ 星期 (0 -6 , 0 =周日) │ │ │ │ │ * * * * * 要执行的命令
📋 常用时间表达式示例
表达式
含义
示例
* * * * *
每分钟执行
实时监控
0 * * * *
每小时执行
整点报告
0 2 * * *
每天 02:00 执行
每日备份
*/10 * * * *
每 10 分钟执行
频繁检查
0 9-18 * * 1-5
工作日 9-18 点整点执行
工作时间任务
0 0 1 * *
每月1号执行
月结任务
0 12 * * 0
每周日中午执行
周报生成
🎯 特殊字符说明
字符
含义
示例
*
任意值
* * * * *
= 每分钟
,
值列表
0 2,14 * * *
= 2点和14点
-
范围
0 9-18 * * *
= 9点到18点每小时
/
步长
*/5 * * * *
= 每5分钟
@
预设
@daily
= 每天一次
⚡ 预设表达式
预设
等价表达式
描述
@yearly
0 0 1 1 *
每年1月1日执行
@annually
0 0 1 1 *
同 @yearly
@monthly
0 0 1 * *
每月1日执行
@weekly
0 0 * * 0
每周日执行
@daily
0 0 * * *
每天执行
@hourly
0 * * * *
每小时执行
@reboot
-
系统启动时执行
🔧 四、crontab 常用操作 📝 基本操作命令
命令
功能
示例
crontab -e
编辑当前用户任务
crontab -e
crontab -l
列出所有任务
crontab -l
crontab -r
删除所有任务
crontab -r
crontab -u user -e
编辑指定用户任务
crontab -u alice -e
crontab -u user -l
列出指定用户任务
crontab -u bob -l
🛠️ 高级管理技巧 1 2 3 4 5 6 7 8 9 10 11 12 13 14 crontab -l > cron_backup.txt crontab cron_backup.txt sudo crontab -u username -ecrontab -e sudo grep CRON /var/log/syslog
📁 文件位置说明
文件/目录
用途
权限
/var/spool/cron/
用户cron文件存储位置
用户各自目录
/etc/crontab
系统cron配置文件
root
/etc/cron.d/
系统cron片段目录
root
/etc/cron.daily/
每日执行脚本
root
/etc/cron.hourly/
每小时执行脚本
root
/etc/cron.weekly/
每周执行脚本
root
/etc/cron.monthly/
每月执行脚本
root
🚀 五、实战:备份任务从 0 到 1 目标 :每天凌晨 3 点自动备份 /etc
目录,保留最近 7 天备份
1️⃣ 创建备份脚本 1 2 3 4 5 6 sudo mkdir -p /backupsudo chmod 755 /backupsudo nano /usr/local/bin/backup-etc.sh
脚本内容:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #!/bin/bash BACKUP_DIR="/backup" DATE=$(date +%Y%m%d_%H%M%S) LOG_FILE="/var/log/backup-etc.log" echo "[$(date) ] 开始备份 /etc 目录..." >> $LOG_FILE tar -czf $BACKUP_DIR /etc-$DATE .tar.gz /etc 2>> $LOG_FILE if [ $? -eq 0 ]; then echo "[$(date) ] 备份成功: etc-$DATE .tar.gz" >> $LOG_FILE else echo "[$(date) ] 备份失败!" >> $LOG_FILE exit 1 fi find $BACKUP_DIR -name "etc-*.tar.gz" -mtime +7 -delete 2>/dev/null echo "[$(date) ] 清理7天前的旧备份" >> $LOG_FILE echo "[$(date) ] 备份任务完成" >> $LOG_FILE
设置执行权限:1 sudo chmod +x /usr/local/bin/backup-etc.sh
2️⃣ 配置cron任务
添加以下内容:1 2 3 4 5 0 3 * * * /usr/local/bin/backup-etc.sh >> /var/log/backup-etc.log 2>&1 0 2 * * 0 find /var/log/backup-etc.log -mtime +30 -delete
3️⃣ 测试配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 sudo /usr/local/bin/backup-etc.shls -la /backup/tail -f /var/log/backup-etc.logrun-parts --test /etc/cron.daily sudo run-parts /etc/cron.daily/
4️⃣ 验证自动化 1 2 3 4 5 6 7 sudo grep CRON /var/log/syslog | tail -10sudo apt install cron-utils cron-list
🏢 六、系统级 vs 用户级 📊 对比表格
特性
用户级cron
系统级cron
配置文件
crontab -e
/etc/crontab
权限
用户权限
root权限
日志
用户邮件或指定文件
系统日志
管理
用户自己管理
系统管理员管理
位置
/var/spool/cron/
/etc/crontab
, /etc/cron.d/
环境
用户环境变量
系统环境变量
📝 系统cron配置示例 编辑 /etc/crontab
:1 2 3 4 5 6 7 8 9 10 11 12 13 SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin MAILTO=admin@example.com 0 2 * * * root find /tmp -type f -mtime +7 -delete 0 3 * * 1 mysql /usr/local/bin/optimize-db.sh 0 * * * * root /usr/local/bin/check-disk-space.sh
📁 定时目录使用 1 2 3 4 5 ls -la /etc/cron.*sudo nano /etc/cron.hourly/my-hourly-task
脚本内容:1 2 3 #!/bin/bash logger "每小时任务执行于 $(date) "
设置执行权限:1 sudo chmod +x /etc/cron.hourly/my-hourly-task
🐞 七、环境变量 & 调试 🔧 环境变量配置 在crontab顶部添加环境变量:
1 2 3 4 5 6 7 8 9 10 11 12 SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin LANG=en_US.UTF-8 HOME=/home/username MAILTO=user@example.com CUSTOM_PATH=/opt/myapp/bin 0 2 * * * $CUSTOM_PATH /daily-task.sh
📊 调试技巧 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 sudo tail -f /var/log/syslog | grep CRON0 * * * * /path/to/script.sh >> /tmp/debug.log 2>&1 0 * * * * /path/to/script.sh 2>&1 | logger -t mycron 0 * * * * env > /tmp/cron-env.log set -x echo "开始执行..."
🐛 常见环境问题解决 1 2 3 4 5 6 7 8 9 10 11 12 13 14 which command_name ls -la /path/to/script.shchmod +x /path/to/script.shsource /home/user/.bashrcexport PATH=$PATH :/custom/path
八、📊 监控与日志管理 📝 日志管理配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 log_file="/var/log/1panel-sync.log" exec >> "$log_file " 2>&1cat > /etc/logrotate.d/1panel-sync <<'EOF' /var/log/1panel-sync.log { daily rotate 7 missingok notifempty compress delaycompress create 644 root root } EOF
1 logrotate -d /etc/logrotate.d/1panel-sync
1 logrotate -f /etc/logrotate.d/1panel-sync
🔔 邮件通知配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 send_email () { local subject=$1 local body=$2 local recipient="admin@example.com" echo "$body " | mail -s "$subject " "$recipient " } if [ $? -eq 0 ]; then send_email "✅ 同步成功" "Home目录同步完成于 $(date) " else send_email "❌ 同步失败" "Home目录同步失败,请检查日志" fi
📋 推荐的计划任务时间表
任务类型
推荐时间
频率
说明
🔄 同步任务
0 /6
每6小时
保持数据实时性
🗜️ 备份任务
0 2 *
每天凌晨
低峰期执行
📋 日志清理
0 4 0
每周日
清理旧日志
🕳️ 九、常见问题排查 📋 问题诊断表
症状
可能原因
解决方法
任务不执行
crond服务未运行
systemctl status cron
权限错误
脚本无执行权限
chmod +x script.sh
路径问题
命令找不到
使用绝对路径
环境问题
环境变量缺失
在crontab中设置PATH
输出丢失
未重定向输出
添加 >> logfile 2>&1
资源限制
内存或CPU不足
优化脚本或调整时间
🔍 详细排查步骤 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 26 27 28 sudo systemctl status cronsudo systemctl restart cronsudo grep CRON /var/log/syslogsudo tail -f /var/log/syslog | grep CRONls -la /path/to/script.shchmod +x /path/to/script.sh/path/to/script.sh env > /tmp/script_env.logtop -b -n 1 | head -20 free -h df -hulimit -a
⚠️ 安全注意事项 1 2 3 4 5 6 7 8 9 10 sudo crontab -l sudo ls -la /etc/cron.d/ sudo grep -r "可疑模式" /etc/cron*
📋 十、速查表 ⏰ 时间表达式速查
需求
表达式
示例
每分钟
* * * * *
实时监控
每5分钟
*/5 * * * *
5分钟检查
每小时
0 * * * *
整点报告
每天2点
0 2 * * *
每日备份
工作日9点
0 9 * * 1-5
工作日任务
每周日3点
0 3 * * 0
周报生成
每月1号
0 0 1 * *
月结任务
每小时30分
30 * * * *
半点任务
🔧 常用命令速查
命令
功能
示例
crontab -e
编辑任务
crontab -e
crontab -l
列出任务
crontab -l
crontab -r
删除所有任务
crontab -r
systemctl status cron
检查服务状态
sudo systemctl status cron
grep CRON /var/log/syslog
查看执行日志
sudo grep CRON /var/log/syslog
📝 最佳实践速查 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 * * * * * /path/script.sh >> /var/log/script.log 2>&1 SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin bash -x /path/to/script.sh echo "$(date) : 任务开始" >> /var/log/cron.log
🎩 十一、高级玩法 🔄 systemd timer 替代方案 1 2 sudo nano /etc/systemd/system/backup-etc.service
1 2 3 4 5 6 7 8 [Unit] Description =Backup /etc directoryAfter =network.target[Service] Type =on eshotExecStart =/usr/local/bin/backup-etc.shUser =root
1 2 sudo nano /etc/systemd/system/backup-etc.timer
1 2 3 4 5 6 7 8 9 10 [Unit] Description =Run backup-etc daily at 3 AMRequires =backup-etc.service[Timer] OnCalendar =*-*-* 03 :00 :00 Persistent =true [Install] WantedBy =timers.target
1 2 3 4 sudo systemctl enable backup-etc.timersudo systemctl start backup-etc.timersudo systemctl list-timers
⚡ at 命令一次性任务 1 2 3 4 5 6 7 8 9 10 echo "/path/to/script.sh" | at now + 1 hourecho "/path/to/script.sh" | at 02:00 tomorrowecho "/path/to/script.sh" | at teatime atq atrm 任务号
🔄 anacron 异步任务 1 2 3 4 5 sudo apt install anacron sudo nano /etc/anacrontab
1 2 3 4 5 6 7 8 SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 1 5 daily-job /usr/local/bin/daily.sh 7 10 weekly-job /usr/local/bin/weekly.sh @monthly 15 monthly-job /usr/local/bin/monthly.sh
🔍 十二、监控与管理 📊 监控工具 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 sudo systemctl status cronsudo journalctl -u cron.servicesudo tail -f /var/log/syslog | grep CRONsudo apt install cron-apt sudo apt install logwatch if ! systemctl is-active --quiet cron; then echo "Cron service is down!" | mail -s "Cron Alert" admin@example.com sudo systemctl start cron fi
🛠️ 管理工具 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ansible all -m cron -a "name='daily backup' hour=3 job='/path/to/backup.sh'" sudo apt install gnome-schedule crontab -l > ~/cron-backup.txt git add ~/cron-backup.txt git commit -m "Backup cron tasks"
📈 性能优化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 0 * * * * /usr/bin/flock -w 0 /tmp/my.lock /path/to/script.sh ulimit -n 1024 ulimit -u 100 0 * * * * nice -n 19 /path/to/cpu-intensive-task.sh
🎯 总结
crontab 就是「时间 + 命令」的自动闹钟,写好路径、加好日志、勤验证,永不踩坑!
✅ 最佳实践清单
✅ 使用绝对路径 - 避免环境变量问题
✅ 重定向输出 - >> logfile 2>&1
✅ 设置环境变量 - 在crontab顶部定义PATH
✅ 测试脚本 - 手动运行验证功能
✅ 添加日志 - 记录执行情况和错误
✅ 权限管理 - 使用最小必要权限
✅ 定期审查 - 清理不再需要的任务
✅ 备份配置 - 定期备份cron任务列表
✅ 监控告警 - 设置任务执行监控
✅ 文档维护 - 记录任务用途和变更
🔧 故障排查流程
检查服务状态 → systemctl status cron
查看执行日志 → grep CRON /var/log/syslog
手动测试脚本 → bash -x script.sh
检查文件权限 → ls -la script.sh
验证环境变量 → env > debug.log
查看系统资源 → top
, free
, df
通过掌握这些技巧和最佳实践,您将能够高效地使用cron来自动化服务器任务,提高工作效率并确保系统的稳定运行。🎉