mosquitto_sub가 포함된 MQTT 메시지를 받았고 출력(두 문자열)을 함수로 리디렉션하고 싶습니다.
고객:
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
) 다음에 리디렉션되는 곳으로 보냅니다. ).