【发布时间】:2021-12-29 23:07:55
【问题描述】:
这是crontab -l 显示的内容:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
*/1 * * * * /bin/bash /home/azureuser/project/negev/restart.sh >> /home/azureuser/out.txt 2>&1
这是restart.sh文件的内容:
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/azureuser/project/negev
variable=$(ps x aux | grep -i 'main.py' | wc -l)
if test $variable=='1'
then
/home/azureuser/miniconda3/envs/negev/bin/python '/home/azureuser/project/negev/main.py'
fi
当我运行main.py 或restart.sh 时,一切都很棒。但是,当我检查 out.txt 文件时,我看到了这个错误:
Traceback (most recent call last):
...
from logger import logger, logger_format
File "/home/azureuser/project/negev/logger.py", line 8, in <module>
log_path = config['LOGGER']['log_path']
File "/home/azureuser/miniconda3/envs/negev/lib/python3.7/configparser.py", line 958, in __getitem__
raise KeyError(key)
KeyError: 'LOGGER
配置文件在/home/azureuser/project/negev/user
我不明白为什么只有在使用crontab 时才会发生这种情况,而且我在任何地方都找不到解决方案。
编辑:问题与我在代码中使用相对路径而不是绝对路径有关。有没有办法在不改变我项目中每一个相对路径的情况下克服这个问题?
【问题讨论】:
-
配置是否有代码所期望的
LOGGER键? -
@jordanm 确实如此,因为如果我直接调用它,代码就会成功运行。
-
@jordanm 这个问题与我在代码中使用相对路径而不是绝对路径有关。有没有办法在不改变我项目中每一个相对路径的情况下克服这个问题?
-
很难说,因为我看不到您在代码中使用路径的位置和方式。通常情况正好相反,您希望避免在代码库中使用绝对路径,因为这样可以更轻松地迁移到不同的系统
-
您可以先将脚本
cd放到适当的目录中(但请检查cd命令上的错误——如果失败,脚本的其余部分将在错误的目录中运行) .顺便说一句,test $variable=='1'是错误的,您需要在运算符周围有空格,而==与test是非标准的,您可能无论如何都想要-eq。ps列出grep命令也可能有问题;pgrep会更好。