我是 Ubuntu 20.04 的新手。我有一个应用程序的文件结构,如下所示:
主页-->Folder1-->execute.sh、main.py、utils.py、ui.py 等。
我打算在系统启动时运行 execute.sh 文件。我的 execute.sh 文件中的行如下:
export PATH="/home/Folder1"
python3 -m venv venv
. ./venv/bin/activate
pip install python-dotenv
python /home/Folder1/main.py
我尝试使用 cron 作业cron -e
来放置一行sh \home\Folder1\execute.sh
,然后启动该过程,但无法使其工作。经过进一步检查,我发现当我访问 root 并尝试运行时sh \home\Folder1\execute.sh
会抛出错误main.py not found
。我必须cd
进入\home\Folder1
然后执行sh execute.sh
才能使其运行。在每次自动重启系统时,实现此目的的最佳方法是什么?
答案1
这在很多层面上都是错误的:)......但没关系,我们会一起努力。
第一级
cron
是一个执行预定命令的守护进程/服务……你不将您的 cron 作业添加到其中...您添加你的 cron 作业对于你的用户来说,crontab
就像这样:
crontab -e
或者像这样对 root 用户执行crontab
:
sudo crontab -e
然后它将自动执行cron
...就是这样。
第二级
sh \home\Folder1\execute.sh
是 Windows 样式的路径,在 Ubuntu 上无效,并且将转换为单个文件名(不是路径),如下所示:
sh homeFolder1execute.sh
它应该使用正斜杠/
而不是反斜杠,例如:
sh /home/Folder1/execute.sh
第三级
您的export PATH="/home/Folder1"
用法不正确,可能会产生您期望添加/home/Folder1
到 PATH 的结果...相反,它会用 just 替换环境变量 PATH 中已有的所有内容,/home/Folder1
这是另一个问题...只需添加/home/Folder1
,您应该这样做:
export PATH="$PATH:/home/Folder1"
奖金等级
作为一般建议,当crontab
一般使用并且crontab
特别是使用根目录时,请指定系统上可执行文件的完整路径(您可以使用例如找到它which sh
),如下所示:
/usr/bin/sh /home/Folder1/execute.sh
还可以使用脚本中使用的可执行文件的完整路径,例如:
/usr/bin/python3 -m venv venv
和:
/usr/bin/python3 /home/Folder1/main.py
和:
/usr/bin/pip install python-dotenv
但是,对于最后两个,它将像在脚本中一样在 python 虚拟环境中python
工作。pip
否则,正在运行的 shell 可能无法找到命令的路径,例如根的环境变量 PATH 将返回与用户 PATH 环境变量返回的路径不同的路径。
但是,您可以保存指定脚本文件的完整路径以及其中来源/引用的其他脚本/文件,首先,cd
在 crontab 行中包含它的目录,如下所示:
cd /home/Folder1 && /usr/bin/sh execute.sh
这并不能免除您不提供系统上可执行文件的完整路径的问题,即/usr/bin/sh
,您仍然需要提供这些文件...为什么不提供完整路径cd
?您可能会问...好吧,答案是cd
是一个内置的 shell 命令并且不需要路径就能正常工作。