我最近将我的iMac 27“(2011年中)从Yosemite升级到High Sierra,我正在努力找回我以前工作的一些功能!
简要说明......首先,我使用Raspberry pi3上的一些Python脚本从地下天气中获取当地的天气数据。这些脚本还按摩数据,然后在pi上创建和存储XML文件。我也在pi上运行一个寻找呼叫的http服务器。
在iPad上,使用iRule,我有一个名为“天气预报”的按钮。当按下此按钮时,它会触发我的ISY994i(Insteon)控制器上的网络资源,该控制器又会在pi上向http服务器发送一个参数。当pi接收到调用并验证参数时,它会运行另一个Python脚本(在pi上),该脚本获取先前创建的XML文件中的数据并将其放入适当的格式以用于下一步。最后,该脚本通过Apache2向iMac发送GET请求,以便大声读取天气预报。
这在优胜美地上运作得非常好,但是现在我已经升级了说法部分不起作用了!
我在iMac上有3个shell脚本,在这个过程中从pi调用...
sayomethinghttp9a.sh这是第一个调用的脚本,它读取当前的音量并将其存储在本地文件中(在iMac上);然后它将音量改为可接受的音量(我使用18);
!/bin/bash
echo -e "Content-type: text/html\n"
PHRASE=`echo "$QUERY_STRING" | sed -n 's/^.*phrase=\([^&]*\).*$/\1/p' | sed "s/+/ /g" | sed "s/%20/ /g"`
cat << junk
<html>
<head>
<title>
saying
</title>
</head>
<body>
junk
currVol=$(osascript -e "get volume settings")
echo "Current Volume Setting = $currVol"
var1=$( echo $currVol | cut -d":" -f1 )
var2=$( echo $currVol | cut -d":" -f2 )
origVol=$( echo $var2 | cut -d"," -f1 )
echo $origVol
parm="set volume output volume $origVol"
echo $parm
destfile="/Users/Sarah/Sound_Volume/Volume1.txt"
echo $parm > $destfile
osascript -e "set volume output volume 18"
cat << junk
</body>
</html>
junk
sayomethinghttp9.sh设置音量级别后,此脚本根据pi发送的内容执行“说”部分。 pi调用这个脚本并发送一个参数,这就是我想说的话。对于介绍,日期,时间,天气预报和结束,此呼叫重复多次;和
#!/bin/bash
echo -e "Content-type: text/html\n"
PHRASE=`echo "$QUERY_STRING" | sed -n 's/^.*phrase=\([^&]*\).*$/\1/p' | sed "s/+/ /g" | sed "s/%20/ /g"`
cat << junk
<html>
<head>
<title>
saying
</title>
</head>
<body>
junk
say "Hey There"
cat << junk
</body>
</html>
junk
sayomethinghttp9b.sh最后调用最后一个脚本,该脚本从第一步创建的文件中读取原始卷,然后将卷重置为该级别。
#!/bin/bash
echo -e "Content-type: text/html\n"
cat << junk
<html>
<head>
<title>
saying
</title>
</head>
<body>
junk
file="/Users/Sarah/Sound_Volume/Volume1.txt"
echo $file
read -d $'\x04' parm < "$file"
echo $parm
osascript -e "$parm"
cat << junk
</body>
</html>
junk
(请注意,我会通过以下步骤调整音量,因为iTunes中的音乐音量对于'say'命令来说太大了)
在试图弄清楚出了什么问题时,我尝试了很多东西:
当从终端调用时,所有3个脚本都工作,这不是问题所在。
为了调试对iMac的调用,我通过从进程中删除iPad,pi和ISY994i简化了这个过程。相反,我一直在尝试使用浏览器从同一网络上的PC拨打iMac。
在PC上直接从浏览器运行脚本的结果就是脚本sayomethinghttp9a.sh和sayomethinghttp9b.sh有效,但是sayomethinghttp9.sh没有!
以下是从PC上的浏览器尝试来自iMac的访问和错误日志条目...
访问日志
10.0.1.195 - - [18/Dec/2017:21:33:30 -0500] "GET /cgi-bin/saysomethinghttp9a.sh HTTP/1.1" 200 197
10.0.1.195 - - [18/Dec/2017:21:34:04 -0500] "-" 408 -
10.0.1.195 - - [18/Dec/2017:21:33:44 -0500] "GET /cgi-bin/saysomethinghttp9.sh HTTP/1.1" 200 53
10.0.1.195 - - [18/Dec/2017:21:33:49 -0500] "GET /cgi-bin/saysomethinghttp9.sh HTTP/1.1" 200 53
10.0.1.195 - - [18/Dec/2017:21:35:05 -0500] "GET /cgi-bin/saysomethinghttp9b.sh HTTP/1.1" 200 135
错误日志
[Mon Dec 18 21:34:44.356130 2017] [cgi:warn] [pid 29997] [client 10.0.1.195:60109] AH01220: Timeout waiting for output from CGI script /Library/WebServer/CGI-Executables/saysomethinghttp9.sh
[Mon Dec 18 21:34:44.356519 2017] [core:error] [pid 29997] (70007)The timeout specified has expired: [client 10.0.1.195:60109] AH00574: ap_content_length_filter: apr_bucket_read() failed
[Mon Dec 18 21:34:49.949284 2017] [cgi:warn] [pid 29575] [client 10.0.1.195:60107] AH01220: Timeout waiting for output from CGI script /Library/WebServer/CGI-Executables/saysomethinghttp9.sh
[Mon Dec 18 21:34:49.949652 2017] [core:error] [pid 29575] (70007)The timeout specified has expired: [client 10.0.1.195:60107] AH00574: ap_content_length_filter: apr_bucket_read() failed
对于完全披露,我的编程经验相对有限。我经常使用我在网上找到的例子将事情拼凑在一起。
我不知道如何解释上面提到的错误!我能找到的与“指定的超时时间已过期”相关的唯一信息与正在处理大量数据的情况有关!就我而言,处理的数据非常少!
我将不胜感激如何进行一些帮助或指导。
编辑:
在阅读了Mark Setchell的评论之后,我在我的脚本中添加了'/ usr / bin / id'并在终端中首先运行脚本并看到该用户名是正确的。然后我从另一台PC运行相同的脚本,看到用户名是'_www'!于是我编辑了httpd.conf(apache2)文件并更改了包含User Sarah和Group人员的部分。然而,这并没有纠正这个问题!
接下来我读到了如何'使用su成为该用户并尝试脚本'。通过读数,我不断寻找使用sudo的建议,最后找到了编辑sudoers文件的建议。所以我使用命令sudo visudo做到了这一点。然后我添加了以下行
Sarah ALL =(全部)NOPASSWD:全部
然后我尝试再次从PC运行脚本,但这次脚本运行并再次说!
在阅读了Mark Setchell的评论之后,我在我的脚本中添加了'/ usr / bin / id'并在终端中首先运行脚本并看到该用户名是正确的。然后我从另一台PC运行相同的脚本,看到用户名是'_www'!于是我编辑了httpd.conf(apache2)文件并更改了包含User Sarah和Group人员的部分。然而,这并没有纠正这个问题!
接下来我读到了如何'使用su成为该用户并尝试脚本'。通过读数,我不断寻找使用sudo的建议,最后找到了编辑sudoers文件的建议。所以我使用命令sudo visudo做到了这一点。然后我添加了以下行
Sarah ALL =(全部)NOPASSWD:全部
然后我尝试再次从PC运行脚本,但这次脚本运行并再次说!