Linux定时任务需正确设置crontab时间格式(分、时、日、月、周、命令)和执行环境(绝对路径、权限、Shell解释器),并验证生效、重定向输出以防静默失败。

Linux定时任务用 crontab 写,核心是掌握时间格式和执行环境两个关键点。写错时间字段或路径不全,任务就“静默失败”——看起来设好了,其实根本没跑。
时间字段必须按顺序填对
每条任务共6个字段,顺序固定:分 时 日 月 周 命令(注意:没有“秒”,最小单位是分钟)
- 分:0–59
- 时:0–23(24小时制)
- 日:1–31
- 月:1–12
- 周:0 或 7 表示周日,1–6 对应周一到周六
常用符号直接套用:
- *:任意值(如 * * * * * 表示每分钟执行一次)
- */5:每隔5个单位(如 */10 * * * * 表示每10分钟)
- 1,3,5:多个离散值(如 0 9 * * 1,3,5 表示每周一、三、五上午9点)
- 9-17:连续范围(如 30 8-18/2 * * 1-5 表示工作日早8:30、10:30、12:30…到18:30)
命令部分要用绝对路径
crond 默认用 /bin/sh 执行,不加载你的 bash 配置,PATH 环境变量也极简。所以:
- 别写 tar -czf backup.tar.gz /data,要先用 which tar 查出路径,写成 /usr/bin/tar -czf /backup/$(date +\%F).tar.gz /data
- 脚本文件本身也要有执行权限:chmod +x /home/user/backup.sh
- 如果脚本依赖 bash 特性(比如数组、双括号判断),开头加 #!/bin/bash,调用时写成 /bin/bash /home/user/backup.sh
保存后要验证是否生效
编辑完别急着走,三步确认:
- 运行 crontab -l 看刚加的那行是否完整显示出来
- 检查 cron 服务是否在运行:systemctl status cron(Ubuntu/Debian)或 systemctl status crond(CentOS/RHEL);若未运行,执行 sudo systemctl start cron && sudo systemctl enable cron
- 加一行日志重定向,例如:*/5 * * * * /usr/bin/uptime >> /tmp/cron_test.log 2>&1,等几分钟看文件有没有新内容
别漏掉输出重定向
crond 默认把命令输出发邮件给当前用户。没人收信?就会堆积成“邮件风暴”,甚至撑爆磁盘。
- 完全丢弃输出:>/dev/null 2>&1
- 记录到日志文件便于排查:>> /var/log/myjob.log 2>&1
- 注意:用 >> 是追加,避免日志被覆盖;2>&1 表示把错误输出也合并进标准输出










