我们有一个在特定目录中运行的应用程序,它使用 flask(以前从未使用过它),并且它被调用自/home/automation_admin/rest-auto/production/TestLauncherApp
进入该目录后,我们运行flask run --host=0.0.0.0 --port=6000 &
我可以通过这种方式毫无问题地运行。如果我从我的主目录尝试并使用:
/home/automation_admin/rest-auto/production/TestLauncherApp/ "flask run --host=0.0.0.0 --port=6000 &"
我得到:
No such file or directory
我正在尝试设置它以便它在启动时运行,并且有一个.sh
cron 应该在启动时运行的文件,但是当我.sh
手动尝试该文件时,它有:
#!/bin/sh
#Starts the automation website on reboot
/home/automation_admin/rest-auto/production/TestLauncherApp/ "flask run --host=0.0.0.0 --port=5000 &"
我得到:
./auto.sh: 3: /home/automation_admin/rest-auto/production/TestLauncherApp/flask run --host=0.0.0.0 --port=5000 &: not found
我怎样才能让它工作?
答案1
从脚本中得到的错误:
./auto.sh: 3: /home/automation_admin/rest-auto/production/TestLauncherApp/flask run --host=0.0.0.0 --port=5000 &: not found
表明 shell 尝试运行的实际路径是
/home/automation_admin/rest-auto/production/TestLauncherApp/flask run --host=0.0.0.0 --port=5000 &
在哪里每个空格都属于路径。这是因为在脚本中您引用了这些空格:
/home/automation_admin/rest-auto/production/TestLauncherApp/"flask run --host=0.0.0.0 --port=5000 &"
(在问题主体中,第一个空格之前有一个未加引号的空格"
,但我认为这是一个拼写错误,因为带有空格的形式会产生不同的错误。)
由于引用,解释脚本的 shell 将整行(在删除引号) 作为一个词,您要运行的可执行文件。您从脚本中得到的错误表明未找到此类可执行文件。
另一方面, 中的空格flask run --host=0.0.0.0 --port=6000 &
不加引号,因此当您运行它时,shell 会将其识别为&
命令终止符、flask
命令(可执行运行)run
以及命令的单独命令行参数。--host=0.0.0.0
--port=6000
脚本中没有引号的那行看起来更好,尽管这是不必要您要运行的线路:
/home/automation_admin/rest-auto/production/TestLauncherApp/flask run --host=0.0.0.0 --port=5000 &
这里应该运行的可执行文件是/home/automation_admin/rest-auto/production/TestLauncherApp/flask
。它不一定是你想要的,因为当你在flask …
将目录更改为 后运行时TestLauncherApp
,你运行flask
的是位于PATH
。
如果你./flask …
调用shell 将(尝试)flask
在当前工作目录中运行.可能flask
被解析PATH
,也可能不被解析./flask
。如果你的PATH
包含当前工作目录(明确或作为.
flask
) 并且在 之前出现的目录中没有PATH
,则将flask
是./flask
。
换句话说,问题告诉我你运行flask
但可能没有运行/home/automation_admin/rest-auto/production/TestLauncherApp/flask
。因此,我不能确定尝试运行后者的线路是否是你需要的。
如果flask run --host=0.0.0.0 --port=6000
从一个路径调用时可以工作,那么从另一个路径调用时也应该可以工作,除非:
.
在 中,PATH
并且 意味着flask
如上所述./flask
。则./flask
可能存在于一个目录中,但不存在于另一个目录中。- 或者也许
run
是相对路径的意思./run
;这同样适用于其他参数。如果你的flask
是这个thenrun
是其内部命令。--host=0.0.0.0
并且--port=6000
绝对看起来像不依赖于当前工作目录的选项。因此,在您的情况下,这个潜在问题很可能不是问题。 - 或者可能
flask
隐式使用当前工作目录(例如,它尝试在那里读取或创建文件)并且另一个目录不适合此(例如,没有必要的文件,或者由于权限不足而无法创建新文件)。
我认为您确实需要将工作目录更改为/home/automation_admin/rest-auto/production/TestLauncherApp
。
你的脚本应该完全按照你flask
在交互式 shell 中运行的方式执行:
#!/bin/sh
cd /home/automation_admin/rest-auto/production/TestLauncherApp
flask run --host=0.0.0.0 --port=6000 &
或者更好(以防cd
失败):
#!/bin/sh
cd /home/automation_admin/rest-auto/production/TestLauncherApp \
&& flask run --host=0.0.0.0 --port=6000 &
它仍将用于PATH
定位。如果您在交互式 shell 中flask
运行脚本,那么它将从交互式 shell 继承;所以它应该可以工作。但如果脚本以以下方式运行,一般会有所不同:./auto.sh
PATH
PATH
来自 cron或者和sudo
,或者从 启动rc.local
,或者使用systemd
,或者以任何不同于交互式 shell 的方式启动。在这种情况下,最直接的解决方案是使用flask
可执行文件的绝对路径。
或者或许你故意想/home/automation_admin/rest-auto/production/TestLauncherApp/flask
以反对 flask
从您的PATH
(例如,因为这些是不同的版本,而您严格想要前者)。在这种情况下,即使您要从交互式 shell 中使用脚本,也要使用完整路径。更改目录可能没有必要。
需要明确的是:当前工作目录和 shell 找到的目录flask
是两个不同的概念。使用cd
您设置的当前工作目录。另一个取决于PATH
,除非flask
您使用包含的路径/
(例如./flask
或another/relative/path/to/flask
或/absolute/path/to/flask
)。这个答案很长,因为我不确定您是否想通过cd
和运行(问题的开头表明了这一点),或者您想使用精确的绝对路径(您从不完善的脚本中得到的错误表明了这一点)。flask
PATH
/home/automation_admin/rest-auto/production/TestLauncherApp/flask