bash 在继续之前等待第一个 python 文件开始
bash wait for first python file to start before continue
我有这个 bash:
#!/bin/sh
# launcher.sh
echo "Remote Control Server is starting up..."
sudo python RControlPanel.py &
wait &
sudo python startup.py &
wait
第一个 python 文件是一个 flask 服务器,需要先启动它。
第二个文件正在初始化 raspberry pi 上的组件,并打开几个 LED 和其他东西。脚本的写法需要先flask应用再初始化组件。
似乎烧瓶应用程序启动时间更长,bash 脚本继续 运行 startup.py
是否可以确保 flask 应用 运行正在运行,然后继续执行下一个脚本?我虽然在最后等待会起作用,但它没有。我什至试过睡觉。
更新:我不太确定,但我认为当 flask 应用程序 运行s 进入无限循环并等待请求时,就像普通的 Web 服务器一样。也许这就是为什么下面的解决方案不起作用的问题。
我想 Flask 服务器打开了一些 HTTP 端口?假设在端口 8080 上,那么您可以像这样轮询应用程序:
while ! curl http://localhost:8080 -m1 -o/dev/null -s ; do
sleep 0.1
done
选项:
-m1
最多允许 1 秒的 HTTP 请求。如果您的防火墙配置为静默地将数据包丢弃到关闭的端口,这应该会使它运行得更快。
-o/dev/null
因此不会打印 HTTP 响应正文。
-s
以隐藏任何错误,如预期的那样。
如果您仍想看到 "Connection refused" 消息滚动,请添加 -S
,直到服务器启动。
只需使用:
sudo python RControlPanel.py && sudo python startup.py &
双重 && 确保第二个命令仅在第一个 returns 退出状态为零后运行。
我想出了一个解决方案,我正在使用 Thomas 的答案。
我创建了一个名为 webserver.sh:
的 sh 文件
echo "Remote Control Server is starting up..."
sudo python RControlPanel.py
然后是第二个文件 components.sh:
while ! curl http://127.0.0.1:80 -m1 -o/dev/null -s ; do
sleep 0.1
echo "Web Server still loading" #This line is for testing purposes
done
sudo python startup.py
echo "Startup Initialazation done. System Ready!"
还有第三个文件launcher.sh:
./launcher.sh
./remoteServer.sh
第一个文件仅启动网络服务器。那里不需要执行其他代码,因为它会被跳过,因为 flask 应用程序是一个无限循环,它会跳过它下面的所有内容。
biggening 的第二个文件是使用 Thomas 代码检查网络服务器是否 运行ning。如果它没有一直循环,直到网络服务器(Flask 应用程序)活跃起来,然后 运行 startup.py python 初始化组件的脚本。
第三个文件只是调用 launcher.sh 和 remoteServer.sh。所以我可以 运行 我的整个项目都在一个文件中,无论哪个文件先开始。
我有这个 bash:
#!/bin/sh
# launcher.sh
echo "Remote Control Server is starting up..."
sudo python RControlPanel.py &
wait &
sudo python startup.py &
wait
第一个 python 文件是一个 flask 服务器,需要先启动它。 第二个文件正在初始化 raspberry pi 上的组件,并打开几个 LED 和其他东西。脚本的写法需要先flask应用再初始化组件。 似乎烧瓶应用程序启动时间更长,bash 脚本继续 运行 startup.py
是否可以确保 flask 应用 运行正在运行,然后继续执行下一个脚本?我虽然在最后等待会起作用,但它没有。我什至试过睡觉。
更新:我不太确定,但我认为当 flask 应用程序 运行s 进入无限循环并等待请求时,就像普通的 Web 服务器一样。也许这就是为什么下面的解决方案不起作用的问题。
我想 Flask 服务器打开了一些 HTTP 端口?假设在端口 8080 上,那么您可以像这样轮询应用程序:
while ! curl http://localhost:8080 -m1 -o/dev/null -s ; do
sleep 0.1
done
选项:
-m1
最多允许 1 秒的 HTTP 请求。如果您的防火墙配置为静默地将数据包丢弃到关闭的端口,这应该会使它运行得更快。-o/dev/null
因此不会打印 HTTP 响应正文。-s
以隐藏任何错误,如预期的那样。
如果您仍想看到 "Connection refused" 消息滚动,请添加 -S
,直到服务器启动。
只需使用:
sudo python RControlPanel.py && sudo python startup.py &
双重 && 确保第二个命令仅在第一个 returns 退出状态为零后运行。
我想出了一个解决方案,我正在使用 Thomas 的答案。 我创建了一个名为 webserver.sh:
的 sh 文件echo "Remote Control Server is starting up..."
sudo python RControlPanel.py
然后是第二个文件 components.sh:
while ! curl http://127.0.0.1:80 -m1 -o/dev/null -s ; do
sleep 0.1
echo "Web Server still loading" #This line is for testing purposes
done
sudo python startup.py
echo "Startup Initialazation done. System Ready!"
还有第三个文件launcher.sh:
./launcher.sh
./remoteServer.sh
第一个文件仅启动网络服务器。那里不需要执行其他代码,因为它会被跳过,因为 flask 应用程序是一个无限循环,它会跳过它下面的所有内容。
biggening 的第二个文件是使用 Thomas 代码检查网络服务器是否 运行ning。如果它没有一直循环,直到网络服务器(Flask 应用程序)活跃起来,然后 运行 startup.py python 初始化组件的脚本。
第三个文件只是调用 launcher.sh 和 remoteServer.sh。所以我可以 运行 我的整个项目都在一个文件中,无论哪个文件先开始。