Linux 中定时任务:crontab

Linux 中最常用的定时任务工具是cron,通过crontab命令来管理。它可以在指定的时间自动执行脚本或命令。

一、定时任务

概念说明
cronLinux 系统的定时任务服务(后台守护进程)
crontab管理定时任务的命令
cron job一个具体的定时任务

二、crontab 基本命令

1. 管理定时任务

# 编辑当前用户的定时任务 crontab -e # 查看当前用户的定时任务 crontab -l # 删除当前用户的所有定时任务 crontab -r # 以指定用户身份操作(需要 root 权限) crontab -u username -e crontab -u username -l

2. 第一次使用

# 第一次执行 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/cron

2. 将输出重定向到文件

# 记录标准输出和标准错误到日志文件 0 2 * * * /path/to/script.sh >> /var/log/myscript.log 2>&1

六、其他定时任务工具

工具说明适用场景
crontab最常用,系统级日常定时任务
at一次性定时任务只执行一次的任务
systemd timerssystemd 定时器现代 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:定时任务没有执行?

检查步骤

  1. 检查 cron 服务是否运行:systemctl status cron

  2. 检查执行权限:chmod +x script.sh

  3. 使用绝对路径:脚本中所有路径都用绝对路径

  4. 检查环境变量:cron 执行时环境变量与登录 shell 不同

# 测试环境变量 * * * * * env > /tmp/cron_env.txt # 对比登录 shell 的环境变量 env > /tmp/shell_env.txt

Q2:在定时任务中使用环境变量

# 在 crontab 文件开头设置环境变量 PATH=/usr/local/bin:/usr/bin:/bin SHELL=/bin/bash JAVA_HOME=/usr/lib/jvm/java-11 # 然后再写任务 0 2 * * * /path/to/script.sh

Q3:crontab 文件在哪里?

# 系统级定时任务 /etc/crontab /etc/cron.d/ /etc/cron.hourly/ /etc/cron.daily/ /etc/cron.weekly/ /etc/cron.monthly/ # 用户级定时任务 /var/spool/cron/crontabs/username