
Linux 中最常用的定时任务工具是cron通过crontab命令来管理。它可以在指定的时间自动执行脚本或命令。一、定时任务概念说明cronLinux 系统的定时任务服务后台守护进程crontab管理定时任务的命令cron job一个具体的定时任务二、crontab 基本命令1. 管理定时任务# 编辑当前用户的定时任务 crontab -e # 查看当前用户的定时任务 crontab -l # 删除当前用户的所有定时任务 crontab -r # 以指定用户身份操作需要 root 权限 crontab -u username -e crontab -u username -l2. 第一次使用# 第一次执行 crontab -e 时会提示选择编辑器 # 推荐选择 3vim.basic或 2nano crontab -e三、时间表达式Cron 表达式1. 基本格式* * * * * 要执行的命令 │ │ │ │ │ │ │ │ │ └─── 星期几0-70和7都表示周日 │ │ │ └───── 月份1-12 │ │ └─────── 日期1-31 │ └───────── 小时0-23 └─────────── 分钟0-592. 特殊符号符号含义示例*任意值* * * * * 每分钟,枚举多个值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 21示例 2定时检查服务状态# 每 5 分钟检查 Nginx 是否运行停止则重启 */5 * * * * systemctl is-active nginx || systemctl restart nginx示例 3定时发送邮件报告# 每天早上 8:00 发送系统状态报告 0 8 * * * /home/user/report.sh | mail -s Daily Report adminexample.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 21六、其他定时任务工具工具说明适用场景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定时任务没有执行检查步骤检查 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.shQ3crontab 文件在哪里# 系统级定时任务 /etc/crontab /etc/cron.d/ /etc/cron.hourly/ /etc/cron.daily/ /etc/cron.weekly/ /etc/cron.monthly/ # 用户级定时任务 /var/spool/cron/crontabs/username