手动执行脚本一切正常,加进 crontab 后每次都报 cat: conf/app.conf: No such file or directory,脚本里写的是 cd ../conf 这种相对路径。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,cron 执行时工作目录是用户家目录,不是脚本所在目录。相对路径基于当前目录解析,换一个启动位置就失效。

「脚本相对路径」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

BASE=$(cd "$(dirname "$0")" && pwd)
cd "$BASE"
source "$BASE/conf/app.conf"

权限不要一口气开到最大,先加到够用再往上试,范围小才好收。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

具体做法是,脚本开头 cd 到自身所在目录 用 dirname $0 取绝对路径;配置和日志都用绝对路径 或者基于脚本目录拼;cron 里显式写 cd 和绝对路径调脚本;清空环境变量手动跑一次 复现 cron 的条件。

最后用这个标准收尾,从任意目录执行脚本都能读到配置,cron 里也不再报文件不存在。

作者 9823189