【发布时间】:2017-02-17 13:11:24
【问题描述】:
我有一个运行 bash 脚本(例如 ScriptA)的 Raspberry Pi,它调用在云服务器上运行的 Web 函数,该函数将一个值返回给调用脚本。云服务器包含一个系统,在该系统中,网站的访问者可以使用按钮获得一些选项,例如 Button1、Button2 和 Button3。访问者选择的选项由 Web 函数发送到 Pi 上的调用 bash 脚本,分别作为 Button1、Button 和 Button3 的 Request1、Request2 或 Request3。 ScriptA 不断递归调用 web 函数以检查请求值的任何变化。该函数返回给 Pi 的值随后用于在 Pi 上运行另一个脚本,例如,Request1 运行 Script1,Request2 运行 Script2,Request3 运行 Script3。现在,网页是动态的,访问者可以一个接一个地点击不同的选项,在树莓派上运行的脚本也需要相应地改变。
Button1 => Request1 | | Request1 => Script1
Button2 => Request2 | Cloud Server <=> Pi(ScriptA) | Request2 => Script2
Button3 => Request3 | | Request3 => Script3
我所做的是,我在 ScriptA 中使用了一个 switch case 在不同的脚本 1、2 和 3 之间切换。我想要的是,只要网站的访问者选择不同的选项并且 Pi接收到新请求,之前选择的选项的脚本停止执行,新请求的脚本开始执行。
#!/bin/bash
# call.sh
while:
do
req=$(curl -d "param=$param" http://www.example.net/req.php)
case $req in
*req1*)
sudo sh /home/pi/stopscript2.sh
sudo sh /home/pi/stopscript3.sh
sudo sh /home/pi/startscript1.sh
;;
*req2*)
sudo sh /home/pi/stopscript1.sh
sudo sh /home/pi/stopscript3.sh
sudo sh /home/pi/startscript2.sh
;;
*req3*)
sudo sh /home/pi/stopscript1.sh
sudo sh /home/pi/stopscript2.sh
sudo sh /home/pi/startscript3.sh
;;
esac
done
但是,这段代码的问题在于,当 pi 第一次收到请求并开始执行传入请求的特定脚本时,此后不再调用 web 函数,脚本继续执行第一次请求,无论用户是否选择了新选项。
如何让它按需要工作?我希望我能很好地提出我的问题。
非常欢迎帮助。提前致谢。
【问题讨论】:
-
所以,如果我理解正确的话,当你收到一个请求时,比如说
*req1*,脚本会停止监听任何其他请求,直到stopscript2.sh、stopscript3.sh和stopscript1.sh完成?如果是这种情况,您可以通过使用以下语法并行运行脚本轻松解决您的问题:stopscript2.sh & -
有一个问题。 startscripts 1、2 和 3 包含无限 while 循环,当仅从命令行运行时,需要按 ctrl+c 才能停止执行。已编写停止脚本,以便它们终止相应的启动脚本。因此,当任何脚本开始执行时,程序流程会在该脚本内继续,并且不会返回调用 Web 函数的父脚本。
-
@DebopamParua: 是否有特殊需要使用
ctrl+c?您能否查看我发布的解决方案,它应该可以实现您想要实现的目标,如果有些不合适,请让我们知道什么是不合适的。我们将尝试修改并再次查看。
标签: linux bash shell raspberry-pi3