shell脚本定时执行关键靠cron调度,需确保cron表达式正确、环境配置稳定,并兼顾语法、路径、环境和日志四方面。

Shell脚本要定时执行,关键靠 cron 调度,而调度是否准确,取决于 cron 表达式写得对不对、环境配得稳不稳。它不是“设完就跑”,而是需要兼顾语法、路径、环境和日志四个层面。
看懂 cron 表达式的五段含义
cron 表达式固定为 5 个时间字段 + 命令,顺序不能错:
-
分钟(0–59):比如
30表示第 30 分钟 -
小时(0–23):比如
2表示凌晨 2 点 -
日期(1–31):比如
15表示每月 15 日 -
月份(1–12):比如
*/2表示每两个月一次 -
星期几(0 或 7=周日,1=周一…6=周六):比如
1-5表示工作日
常见组合举例:0 3 * * * /home/user/backup.sh → 每天凌晨 3 点执行*/10 * * * * /usr/bin/python3 /opt/check.py → 每 10 分钟运行一次@reboot /opt/startup.sh → 系统启动时执行(注意:仅适用于用户级 crontab)
确保脚本能被 cron 正确调用
cron 不加载你的 shell 配置,所以很多“手动能跑,定时失败”的问题都出在这儿:
- 脚本开头必须有
#!/bin/bash或对应解释器声明 - 命令中所有可执行文件要用绝对路径,比如
/usr/bin/python3而不是python3 - 脚本本身要有执行权限:
chmod +x /path/to/script.sh - 如果依赖环境变量(如
PATH、HOME),建议在 crontab 里显式设置:PATH=/usr/local/bin:/usr/bin:/bin<br> HOME=/home/username<br> 0 4 * * * /path/to/script.sh
任务执行结果别“石沉大海”
cron 默认把 stdout 和 stderr 发邮件给当前用户,但多数服务器没配邮件服务,结果就是输出直接丢弃——你根本不知道脚本是成功了还是报错了:
- 务必重定向日志:
0 2 * * * /path/to/script.sh >> /var/log/myscript.log 2>&1 - 日志文件路径要确保 cron 用户有写入权限(比如普通用户不能往
/var/log写,可改用~/log/) - 加个简单时间戳方便排查:
echo "$(date): start" >> /path/to/log放在脚本开头
管理任务用对命令,避免误删或冲突
日常操作别直接编辑文件,统一用 crontab 命令更安全:
- 查看当前任务:
crontab -l - 编辑任务(自动检查语法):
crontab -e - 清空所有任务(慎用):
crontab -r - 想删某一行?只能进
crontab -e手动删掉对应行 - 系统级任务(需 root 权限)写在
/etc/crontab,格式多一列用户名:0 1 * * * root /usr/local/bin/daily-maint.sh











