在系统启动时运行 sh 脚本,在 root 模式下运行时出现文件不可用错误

在系统启动时运行 sh 脚本,在 root 模式下运行时出现文件不可用错误

我是 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 命令并且不需要路径就能正常工作。

相关内容