脚本执行权限缺失是crontab静默失败的主因,需用ls -l确认x位存在,再chmod +x赋予执行权,配合绝对路径调用及日志重定向验证生效。

直接看脚本权限,是最快速锁定这类问题的方式。crontab不会报“没权限”这种明确错误,而是静默失败——任务看似被调度了,但根本没跑起来,日志里也常为空或只有一句“Permission denied”。
确认脚本是否真有执行权限
别凭感觉,用命令实锤:
- 运行 ls -l /path/to/your/script.sh,重点看最左边那串权限字符(如 -rw-r--r--)。如果第三位不是 x(比如是 -),说明没有执行权限;正确应类似 -rwxr-xr-x 或至少 -rwx------
- 注意:即使脚本是 .sh 后缀,Linux 也不靠后缀判断可执行性,全看 x 位是否开启
补上执行权限并验证
加权限不是目的,确保它生效才是关键:
- 执行 chmod +x /path/to/your/script.sh(推荐)或更精确的 chmod 755 /path/to/your/script.sh
- 再运行一次 ls -l 确认 x 出现在所有者、组或其他任一栏位
- 手动测试:在终端里直接运行 /path/to/your/script.sh,看是否能正常执行(避免后续再被环境问题干扰)
顺手检查 crontab 条目是否用了绝对路径
权限对了,但路径写错照样白搭:
- 用 crontab -l 查看任务行,确认调用的是完整路径(如 /home/user/backup.sh),而不是 ./backup.sh 或 backup.sh
- crontab 不继承你的 shell 当前目录,相对路径基本无效
- 如果脚本里还调用了其他命令(比如 python、mysqldump),也建议在脚本内用 which python 找到绝对路径并硬编码,或在脚本开头显式设置 PATH
加一行日志,让失败“看得见”
光加权限还不够,得确认 cron 真的调用了它:
- 在 crontab 条目末尾加上日志重定向,例如:
0 2 * * * /home/user/backup.sh >> /home/user/backup.log 2>&1 - 等下次触发时间过去后,立刻查日志:tail -n 20 /home/user/backup.log
- 如果日志为空或只有 “Permission denied”,基本就是权限没加对;如果有输出但脚本逻辑没生效,问题就转向脚本内容或环境变量了











