我最近将iMac 27(2011年年中)从约塞米蒂升级到High Sierra,我正在努力恢复以前使用的一些功能!
首先简要说明一下,我在Raspberry pi3上使用一些Python脚本从weather underground获取本地天气数据。这些脚本还处理数据,然后在pi上创建并存储XML文件。我还在pi上运行一个查找调用的http服务器。
在iPad上,使用iRule,我有一个叫做“天气预报”的按钮。当按下此按钮时,它会触发我的ISY994i(Insteon)控制器上的网络资源,该资源反过来调用pi上的http服务器,并向其发送参数。当pi接收到调用并验证参数时,它会运行另一个Python脚本(在pi上),该脚本获取之前创建的XML文件中的数据,并将其转换为下一步所需的适当格式。最后,该脚本通过Apache2向iMac发送GET请求,以大声读取天气预报。
这在优胜美地上运行得很好,但现在我已经升级了
说
部件不工作!
我在iMac上有3个shell脚本,在此过程中从pi调用
说点什么Http9a。上海
这是第一个名为的脚本,它读取当前卷级别并将其存储在本地文件中(在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
说点什么Http9。上海
设置卷级别后,此脚本根据pi发送的内容执行say部分。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
说点什么Http9b。上海
最后调用最后一个脚本,该脚本从第一步中创建的文件中读取原始卷,然后将卷重置为该级别。
#!/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命令来说太大了
)
为了找出问题所在,我尝试了许多方法:
-
我编辑了脚本saysomethinghttp9。sh来消除传递给它的参数的say,只需在行中输入say Hey there(
请注意,上面的代码是经过编辑的版本
)
-
然后我在iMac上打开了一个终端会话,并从那里发出命令。。。
-
./说点什么Http9a。上海
-
./说点什么Http9。上海
-
./说点什么Http9b。上海
从终端调用时,所有3个脚本都能正常工作,所以这不是问题所在。
为了调试对iMac的调用,我简化了流程,从流程中删除了iPad、pi和ISY994i。相反,我一直在尝试使用浏览器从同一网络上的PC向iMac打电话。
在PC上直接从浏览器运行脚本的结果就是该脚本
说点什么Http9a。上海
和
说点什么Http9b。上海
工作,但
说点什么Http9。上海
没有!
以下是在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”,并首先在终端中运行脚本,发现用户名是正确的。然后我从另一台电脑上运行了相同的脚本,看到用户名是“\u www”!于是我编辑了httpd。conf(apache2)文件并更改了包括
用户Sarah
和
集团员工
. 然而,这并没有纠正问题!
接下来,我阅读了如何“使用su成为那个用户并尝试脚本”。通过阅读,我不断找到使用sudo的建议,最后找到了编辑sudoers文件的建议。所以我用这个命令
sudo visudo
. 然后我在下面的行中添加了
Sarah全部=(全部)无密码:全部
然后我再次尝试从PC上运行脚本,但这次脚本运行了
说
再一次