Crontab执行Python脚本崩溃,如何在不修改项目中所有相对路径的情况下解决问题?
解决Cron运行Python脚本时的相对路径问题
这个问题的核心是Cron的默认工作目录和你手动运行脚本时的工作目录不一致。当你手动运行restart.sh或者main.py时,你是在/home/azureuser/project/negev目录下操作的,所以代码里的相对路径(比如读取user配置文件)能正确指向项目里的对应文件。但Cron默认会以你的用户主目录(/home/azureuser)作为工作目录来执行任务,这就导致Python脚本尝试读取/home/azureuser/user(不存在或者内容不符合预期),进而触发KeyError: 'LOGGER'。
不用修改项目里所有相对路径的话,最简单的解决办法是在restart.sh里先切换到项目目录,再执行Python脚本,具体修改如下:
#!/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/azureuser/project/negev # 先切换到Python脚本所在的项目目录 cd /home/azureuser/project/negev # 修正进程数统计:过滤掉grep自身的进程,避免误判 variable=$(ps x aux | grep -i 'main.py' | grep -v grep | wc -l) # 修正条件判断语法:test命令的数值比较要用-eq,且运算符两边必须有空格 if test $variable -eq 1 then /home/azureuser/miniconda3/envs/negev/bin/python main.py fi
这里额外修正了两个容易踩坑的小问题:
- 原
ps命令会把grep main.py这条查询进程本身也算进去,所以加上grep -v grep过滤掉这条无关进程,避免误判进程数量。 - 原条件判断
test $variable=='1'语法错误:test命令的数值比较要用-eq(等于),且运算符两边必须有空格,否则不管variable的值是什么,这个条件都会被判定为真(因为它把$variable=='1'当作非空字符串处理)。
这样修改后,Cron执行restart.sh时会先进入项目目录,Python脚本运行时的工作目录就和你手动运行时完全一致了,所有相对路径都能正常解析,不用修改任何Python代码。
内容的提问来源于stack exchange,提问作者EL_9
相关产品推荐
相关产品推荐

