定时任务"手动能跑、cron 不跑",九成不是脚本坏了,而是环境不一样。下面五个坑按踩到的频率排序。
一、PATH 不一样
cron 的环境变量极简,PATH 通常只有 /usr/bin:/bin。脚本里调用的命令如果在 /usr/local/bin,就会报 command not found。两种解法:在 crontab 顶部写 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin,或者在脚本第一行显式 export PATH。后者更稳,因为脚本被别处调用时同样生效。
二、百分号要转义
crontab 里 % 是换行符的特殊标记。命令里带日期格式 date +%Y%m%d 会直接被截断。正确写法是 date +\%Y\%m\%d,或者干脆把逻辑放进脚本文件,crontab 只负责调用。
三、上一轮没跑完,下一轮又来了
任务执行时间超过间隔时,会堆叠成多个进程互相踩数据。用 flock 加非阻塞锁是最省事的办法:
*/5 * * * * flock -n /tmp/job.lock -c '/www/backup/scripts/job.sh'
拿不到锁就静默退出,不排队、不堆积。
四、没有日志等于没有排障
cron 默认把输出发邮件,服务器没配 MTA 时全部丢掉。养成习惯:每条任务都重定向。
0 3 * * * /usr/bin/python3 /path/job.py >> /path/job.log 2>&1
日志要配轮转,否则半年后一个文件吃掉几个 G。
五、时区对不上
系统时区和 crontab 解释的时区不一致时,"凌晨三点备份"可能变成下午三点。检查 timedatectl 输出的时区,必要时在 crontab 里加 CRON_TZ=Asia/Shanghai。容器环境尤其要注意,宿主和容器时区经常不同。
把上面五条核对一遍,剩下的问题基本就是脚本自身的逻辑了。
本文首发于 izzsj.com,作者保留全部权利。未经书面授权,禁止任何形式采集、转载与镜像;转载请注明来源并保留原文链接。
相关阅读
- 使用IMG2KVM快捷为Proxmox导入IMG镜像img2kvm是一个在PVE下导入IMG文件到虚拟机的工具,可以将img文件(含gz的压缩格
- 最新WIN10镜像下载.文件名 cn_windows_10_business_edition
- fail2ban 防暴力破解实战:让扫描器无处下手
- VPS 怎么选?国内外主机、线路与配置全解析(2025版)




还没有评论,来说两句吧...