最近、私の「iMac 27」(2011年中頃)を「ヨセミテ」から「ハイシエラ」にアップグレードしましたが、以前働いていた機能を取り戻すのに苦労しています。iMacのシェルスクリプトがハイシエラで動作しなくなった
簡潔に説明するにはまず、地下の気象から地元気象データを取得し、いくつかのPythonスクリプトをラズベリーのpi3で使用します。これらのスクリプトは、データをマッサージしてから、piにXMLファイルを作成して保存します。私はまた、piで、呼び出しを探すhttpサーバを実行します。
iRuleを使用するiPadでは、「天気予報」と呼ばれるボタンがあります。このボタンを押すと、自分のISY994i(Insteon)コントローラのネットワークリソースがトリガーされ、これがpiサーバー上のhttpサーバーを呼び出してパラメーターを送信します。 piが呼び出しを受け取り、パラメータを検証すると、piで別のPythonスクリプトが実行され、以前に作成されたXMLファイルのデータを受け取り、次のステップのための適切な形式にします。最後に、このスクリプトはApache2経由でiMacにGETリクエストを送信し、天気予報を大声で読み込みます。
これはヨセミテでうまくいきましたが、今ではがという部分が機能していないと言ってアップグレードしました。
私は、このプロセスでは、PIから、と呼ばれているのiMac上の3つのシェルスクリプトを持っている...
saysomethinghttp9a.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
saysomethinghttp9.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
saysomethinghttp9b.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のからの音楽の音量は、はるかに大きすぎるので、私はボリュームを調整するための手順を経るノートはコマンド「と言います」)何が間違っている私は、多くの事を試してみました:
私は(それに渡されたパラメータの「と言う」と単にラインに入れては「ちょっとそこ」と言うノート番目を排除するために、スクリプトsaysomethinghttp9.shを編集しました上記のコードで編集されたバージョンです)
私は、その後のiMac上の端末セッションを開いて、そこからコマンドを発行した...
./saysomethinghttp9a.sh
./saysomethinghttp9。端末から呼び出されたときにそれは問題ではなかったので、すべての3つのスクリプトが働い./saysomethinghttp9b.sh
SH
。
iMacへの呼び出しをデバッグするために、私はiPad、pi、およびISY994iをプロセスから削除することでプロセスを単純化しました。代わりに、ブラウザを使用して同じネットワーク上のPCからiMacに電話をかけようとしていました。
- は、PC上で、そのスクリプト saysomethinghttp9a.shブラウザから直接スクリプトを実行した結果だった
とsa ysomethinghttp9b.shは働いたがsaysomethinghttp9.shしなかった!ここで
のiMacからのアクセスとエラーのログエントリは... PC上のブラウザからの呼び出しを試みた後
アクセスログ
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
です
完全な開示のために、私のプログラミング経験は比較的限られています。私はしばしば、オンラインで見つけた例を使って物事をまとめます。
私は上記のエラーをどのように解釈するのか分かりません! 「指定されたタイムアウトが期限切れになっています」に関連する唯一の情報は、多くのデータが処理されている状況に関連していました。私の場合、処理されるデータはほとんどありません!
今後の進め方については、お手数ですが、
編集:
マークSetchellからのコメントを読んだ後、私は私のスクリプトに「は/ usr/binに/ ID」を追加し、端末に最初のスクリプトを実行し、ユーザー名が正しかったことを見ました。その後、私は他のPCから同じスクリプトを実行し、ユーザー名が「_www」であることを確認しました!そこで、httpd.conf(apache2)ファイルを編集し、セクションを変更しました。ユーザーSarahとグループスタッフ。しかし、これは問題を修正しませんでした!
次は、「suを使ってそのユーザーになり、スクリプトを試してみよう」という方法を読みました。読書を通じて、私はsudoを使う提案を見つけ出し、最後にsudoersファイルを編集する提案を見つけました。だから私はコマンドを使用してこれをしたsudo visudo。それから私は、次の行に
サラALL =(ALL)NOPASSWDを追加しました:
は、その後、私は再びPCからスクリプトを実行しようとしたALLは、しかし、この時間は、スクリプトが走って が再びを言っています!
各スクリプトの2行目にPATHが正しく設定されていることを確認して、呼び出したすべてのバイナリを含めるようにしてください。 'say'、' osascript'なので 'export PATH =/bin:/ usr/bin:$ PATH'になります。 –
空白、コロン、コンマを 'vol = $(osascript -e" get volume settings "のようなフィールド区切り文字として扱いますが、' osascript'コマンドの第3フィールドを取得するように 'awk'に伝えることで、 | awk -F '[:、]' '{print $ 3}') –
マーク...あなたのコメントをいただきありがとうございます。あなたのPATH行をスクリプトに追加しましたが、結果は同じです - 2つのスクリプトは動作しますが、 'say'を実行するスクリプトは動作しません!あなたの現在のボリュームを取得することを簡素化するためのあなたの他の提案に関しては...ありがとう、私は時間があるときにそれを試みます。 – Gary