mosquitto_subを含むMQTTメッセージを受け取り、出力(2つの文字列)を関数にリダイレクトしたいと思います。
顧客:
mosquitto_pub -d -t hello/world/ -m "Alessio,base64"
サーバーにはbashプログラムがあります
サーバー:(有効)
function pipeTee(){
tee -a mqtt_broker.log
}
mosquitto_sub -t +/# | pipeTee
ただし、別の関数にパイプしようとすると、プログラムは機能しません。
#!/bin/bash
function testPipe(){
echo "va"
}
function pipeTee(){
tee -a mqtt_broker.log
}
mosquitto_sub -t +/# | pipeTee | testPipe
クライアントのmosquitto_pub:
mosquitto_pub -d -t hello/world -m "Aless,base64"
Client mosqpub/1841-raspberryp sending CONNECT
Client mosqpub/1841-raspberryp received CONNACK
Client mosqpub/1841-raspberryp sending PUBLISH (d0, q0, r0, m1, 'hello/world', ... (12 bytes))
Client mosqpub/1841-raspberryp sending DISCONNECT
サーバーが機能しない場合:
pi@raspberrypi:~ $ ./mqtt_broker.sh
va
^C
ファイルログが空です
答え1
次のシェルスクリプトを考えてみましょう。
function thetee {
tee data.out
}
function thepipe {
echo "Hello!"
}
while true; do
echo "Hi there!"
done | thetee | thepipe
echo "Done."
ここで、-loop はwhile
「Hi There!」というテキストを含む無限行のジェネレータです。
実行してください:
$ sh script.sh
Hello!
Done.
次に、次の行数を確認してくださいdata.out
。
$ wc -l data.out
274 data.out
再:
$ sh script.sh
Hello!
Done.
$ wc -l data.out
236 data.out
質問:
- 無限ループは無限ではありません。
- 出力ラインの数は実行ごとに異なります。
理由:
私の例の関数は
thepipe
文字列をエコーしてから終了し、パイプが失敗します。パイプラインの最後のステップでは追加の入力を処理できず、ループは終了します。作成される実際の行数は、
data.out
シェルがパイプを開始する速度と、関数が操作を実行thepipe
および終了する速度によって異なります。
あなたの場合、これは早すぎるため、mosquitto_sub
データジェネレータ()の入力が関数tee
に到達できません。
解決策:
実際の生産thepipe
機能入力を消費する:
function thepipe {
echo "Hello!"
cat
}
その後、私の例のコードは「Hello!」と「Hi there!」という無限の数字を出力します(また、に保存されていますdata.out
)。echo
最後は実行されません。
だから:
testPipe
同様に関数の定義を変更します。たとえば、
function testPipe(){
echo "va"
cat
}
これは入力を消費し、それをパイプラインの次のステップに送るという効果があります。または、パイプラインの末尾にある場合は、標準出力がストリーム(文字列を含む行を含むva
)の後にリダイレクトされる場所に送信します。 )。