Linux 定时任务(cron)是自动化运维的重要工具,可以定期执行脚本和命令。
cron 基本概念:
- cron 是 Linux 系统的定时任务调度器
- 由 cron 守护进程(crond)负责执行定时任务
- 配置文件:/etc/crontab(系统级)、/var/spool/cron/username(用户级)
- 时间格式:分 时 日 月 周 命令
时间格式说明:
- 分(0-59):每小时的第几分钟
- 时(0-23):每天的第几小时
- 日(1-31):每月的第几天
- 月(1-12):每年的第几个月
- 周(0-7,0 和 7 都表示周日):每周的第几天
特殊符号:
- *:匹配所有值
- ,:分隔多个值,如 1,3,5 表示第 1、3、5
- -:表示范围,如 1-5 表示 1 到 5
- /n:表示间隔,如 */5 表示每 5 个单位
常用示例:
- 每分钟执行:* * * * * command
- 每小时执行:0 * * * * command
- 每天凌晨 2 点执行:0 2 * * * command
- 每周一凌晨 3 点执行:0 3 * * 1 command
- 每月 1 号凌晨 4 点执行:0 4 1 * * command
- 每 5 分钟执行一次:*/5 * * * * command
- 工作日(周一到周五)每天上午 9 点执行:0 9 * * 1-5 command
crontab 命令:
- crontab -e:编辑当前用户的定时任务
- crontab -l:列出当前用户的定时任务
- crontab -r:删除当前用户的所有定时任务
- crontab -u username -e:编辑指定用户的定时任务(需要 root 权限)
系统级定时任务:
- /etc/crontab:系统级定时任务配置文件
- /etc/cron.hourly/:每小时执行的任务目录
- /etc/cron.daily/:每天执行的任务目录
- /etc/cron.weekly/:每周执行的任务目录
- /etc/cron.monthly/:每月执行的任务目录
环境变量:
- cron 任务执行时环境变量与用户登录时不同
- 可以在 crontab 文件中定义环境变量
- 建议在脚本中使用绝对路径
- 可以在脚本开头 source 环境变量文件:source ~/.bashrc
日志和调试:
- cron 日志位置:/var/log/syslog 或 /var/log/cron
- 查看日志:grep CRON /var/log/syslog
- 调试技巧:将输出重定向到日志文件:command >> /tmp/cron.log 2>&1
- 发送邮件:cron 默认会将输出发送到用户邮箱
最佳实践:
- 使用绝对路径
- 在脚本中设置正确的环境变量
- 添加日志记录便于调试
- 使用锁文件防止重复执行
- 测试脚本后再添加到 cron
- 合理设置执行时间,避免系统高峰期
- 定期检查 cron 任务执行情况
常见问题:
- 脚本权限不足:确保脚本有执行权限(chmod +x script.sh)
- 环境变量问题:在脚本中显式设置环境变量
- 路径问题:使用绝对路径或切换到正确目录
- 时区问题:确保系统时区正确
- cron 服务未启动:systemctl status cron 或 systemctl start cron
anacron(异步 cron):
- 用于不是 24 小时运行的系统
- 配置文件:/etc/anacrontab
- 适合笔记本电脑等不常开机的设备
- 会检查上次执行时间,如果错过则补执行
systemd 定时器:
- systemd 的定时任务替代方案
- 配置文件:/etc/systemd/system/*.timer
- 查看定时器:systemctl list-timers
- 更灵活的调度选项
- 更好的日志集成