为何Crontab任务无法找到正确的文件路径?
Crontab执行auto_run.sh脚本报错的问题分析与解决
问题背景
有一个名为auto_run.sh的脚本被设置为Crontab任务,脚本内容如下:
echo "Enter base root directory ..." cd ./base export PYTHONPATH=`pwd` echo "Downloading resources ..." python3 ./util/fetch.py -o ./ downloadResources echo "Exit from base and enter the upper level directory ..." cd .. python3 ./test/data_poster.py echo "done ..."
脚本的执行逻辑:
- 在当前项目根目录进入
base/子目录 - 在
base/目录下下载资源文件 - 退出
base/目录回到根目录,运行data_poster.py
但通过Crontab执行时出现报错,日志内容:
python3: can't open file './util/fetch.py': [Errno 2] No such file or directory python3: can't open file './test/data_poster.py'
手动运行sh auto_run.sh时一切正常,为何Crontab任务无法执行这两个Python脚本?问题出在哪里?
问题原因
核心问题是Crontab的工作目录与手动执行脚本时的工作目录不一致:
- 手动执行脚本时,你是在项目根目录下运行
sh auto_run.sh,此时脚本里的所有相对路径(./base、./util/fetch.py等)都是基于项目根目录解析的,所以能找到对应文件。 - Crontab执行任务时,默认的工作目录是当前用户的主目录(比如
/home/你的用户名/),而非你的项目根目录。脚本里的相对路径会基于这个主目录去查找,自然找不到项目里的文件,就会抛出“文件不存在”的错误。
解决办法
方法一:脚本开头切换到项目绝对路径
先确定你的项目根目录的绝对路径(比如/home/marlon/your_project),在脚本最开头添加切换目录的命令,确保后续所有操作都在正确的目录下执行:
# 切换到项目根目录,切换失败则直接退出脚本 cd /home/marlon/your_project || exit 1
方法二:替换所有相对路径为绝对路径
把脚本里所有的相对路径都改成对应文件/目录的绝对路径,比如:
echo "Enter base root directory ..." cd /home/marlon/your_project/base export PYTHONPATH=`pwd` echo "Downloading resources ..." python3 /home/marlon/your_project/base/util/fetch.py -o ./ downloadResources echo "Exit from base and enter the upper level directory ..." cd /home/marlon/your_project python3 /home/marlon/your_project/test/data_poster.py echo "done ..."
内容的提问来源于stack exchange,提问作者marlon
相关产品推荐
相关产品推荐

