Linux 中定时任务:crontab
Linux 中最常用的定时任务工具是cron,通过crontab命令来管理。它可以在指定的时间自动执行脚本或命令。
一、定时任务
| 概念 | 说明 |
|---|---|
| cron | Linux 系统的定时任务服务(后台守护进程) |
| crontab | 管理定时任务的命令 |
| cron job | 一个具体的定时任务 |
二、crontab 基本命令
1. 管理定时任务
# 编辑当前用户的定时任务 crontab -e # 查看当前用户的定时任务 crontab -l # 删除当前用户的所有定时任务 crontab -r # 以指定用户身份操作(需要 root 权限) crontab -u username -e crontab -u username -l2. 第一次使用
# 第一次执行 crontab -e 时会提示选择编辑器 # 推荐选择 3(vim.basic)或 2(nano) crontab -e三、时间表达式(Cron 表达式)
1. 基本格式
* * * * * 要执行的命令 │ │ │ │ │ │ │ │ │ └─── 星期几(0-7,0和7都表示周日) │ │ │ └───── 月份(1-12) │ │ └─────── 日期(1-31) │ └───────── 小时(0-23) └─────────── 分钟(0-59)2. 特殊符号
| 符号 | 含义 | 示例 |
|---|---|---|
* | 任意值 | * * * * *= 每分钟 |
, | 枚举多个值 | 1,15 * * * *= 第1和15分钟 |
- | 范围 | 1-5 * * * *= 第1到5分钟 |
/ | 步长 | */5 * * * *= 每5分钟 |
*/10 * * * * | 每10分钟执行一次 |
3. 常见时间表达式
# 每分钟执行 * * * * * /path/to/script.sh # 每小时执行(整点) 0 * * * * /path/to/script.sh # 每天凌晨 2:30 执行 30 2 * * * /path/to/script.sh # 每周一凌晨 3:00 执行 0 3 * * 1 /path/to/script.sh # 每月 1 号凌晨 4:00 执行 0 4 1 * * /path/to/script.sh # 每 10 分钟执行 */10 * * * * /path/to/script.sh # 工作日(周一至周五)上午 9:00 执行 0 9 * * 1-5 /path/to/script.sh # 周末上午 10:00 执行 0 10 * * 6,0 /path/to/script.sh四、应用示例
示例 1:日志清理
# 每天凌晨 3:00 清理超过 30 天的日志 0 3 * * * find /var/log/myapp -name "*.log" -mtime +30 -delete >> /var/log/cleanup.log 2>&1示例 2:定时检查服务状态
# 每 5 分钟检查 Nginx 是否运行,停止则重启 */5 * * * * systemctl is-active nginx || systemctl restart nginx示例 3:定时发送邮件报告
# 每天早上 8:00 发送系统状态报告 0 8 * * * /home/user/report.sh | mail -s "Daily Report" admin@example.com五、调试
1. 查看 cron 日志
# 查看 cron 日志(不同系统位置不同) tail -f /var/log/syslog | grep CRON # 或 tail -f /var/log/cron2. 将输出重定向到文件
# 记录标准输出和标准错误到日志文件 0 2 * * * /path/to/script.sh >> /var/log/myscript.log 2>&1六、其他定时任务工具
| 工具 | 说明 | 适用场景 |
|---|---|---|
| crontab | 最常用,系统级 | 日常定时任务 |
| at | 一次性定时任务 | 只执行一次的任务 |
| systemd timers | systemd 定时器 | 现代 Linux 系统推荐 |
| anacron | 非 7x24 运行的系统 | 笔记本电脑 |
一次性任务(at)
# 安装 at sudo apt install at # 现在执行一次(立即) echo "command" | at now # 一分钟后执行 echo "command" | at now + 1 minute # 明天上午 10:00 执行 echo "command" | at 10:00 tomorrow # 查看队列 atq # 删除任务 atrm <job_id>七、常见问题排查
Q1:定时任务没有执行?
检查步骤:
检查 cron 服务是否运行:
systemctl status cron检查执行权限:
chmod +x script.sh使用绝对路径:脚本中所有路径都用绝对路径
检查环境变量:cron 执行时环境变量与登录 shell 不同
# 测试环境变量 * * * * * env > /tmp/cron_env.txt # 对比登录 shell 的环境变量 env > /tmp/shell_env.txtQ2:在定时任务中使用环境变量
# 在 crontab 文件开头设置环境变量 PATH=/usr/local/bin:/usr/bin:/bin SHELL=/bin/bash JAVA_HOME=/usr/lib/jvm/java-11 # 然后再写任务 0 2 * * * /path/to/script.shQ3:crontab 文件在哪里?
# 系统级定时任务 /etc/crontab /etc/cron.d/ /etc/cron.hourly/ /etc/cron.daily/ /etc/cron.weekly/ /etc/cron.monthly/ # 用户级定时任务 /var/spool/cron/crontabs/username