Saída de demônio de tubulação para uma função

1

Estou recebendo uma mensagem MQTT com mosquitto_sub e quero redirecionar a saída (duas strings) para uma função.

CLIENTE:

mosquitto_pub -d -t hello/world/ -m "Alessio,base64"

No servidor eu tenho um programa bash

SERVER: (funciona)

function pipeTee(){
        tee -a mqtt_broker.log
}
mosquitto_sub -t +/# | pipeTee

mas se eu tentar t pipe para outra função também, o programa não funciona.

#!/bin/bash
function testPipe(){
        echo "va"
}

function pipeTee(){
        tee -a mqtt_broker.log
}
mosquitto_sub -t +/# | pipeTee | testPipe

mosquitto_pub do cliente:

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

Servidor quando não está funcionando:

pi@raspberrypi:~ $ ./mqtt_broker.sh 
va
^C

e o log do arquivo está vazio

    
por Mitro 07.07.2016 / 12:46

1 resposta

2

Considere o seguinte script de shell:

function thetee {
    tee data.out
}

function thepipe {
    echo "Hello!"
}

while true; do
    echo "Hi there!"
done | thetee | thepipe

echo "Done."

O while -loop aqui é um gerador de linhas ilimitadas com o texto "Hi there!".

Executando:

$ sh script.sh
Hello!
Done.

Em seguida, observe o número de linhas em data.out :

$ wc -l data.out
     274 data.out

Novamente:

$ sh script.sh
Hello!
Done.

$ wc -l data.out
     236 data.out

Problemas:

  1. O loop infinito não é infinito.
  2. O número de linhas de saída difere entre as execuções.

Razões:

  1. A função thepipe no meu exemplo simplesmente ecoa uma string e sai, fazendo com que o pipe falhe. Nenhuma entrada adicional pode ser processada pelo último estágio do pipeline e o loop sai.

  2. O número de linhas realmente gravadas em data.out depende da rapidez com que o shell é capaz de inicializar o pipeline e com que rapidez a função thepipe pode fazer a sua coisa e sair.

No seu caso, isso acontece tão rapidamente que nenhuma entrada do gerador de dados ( mosquitto_sub ) é capaz de chegar à função tee .

Solução:

Faça a função thepipe realmente consumir sua entrada :

function thepipe {
    echo "Hello!"
    cat
}

Isso fará com que o código no meu exemplo exiba um único "Hello!" seguido por infinito "Hi there!" (que também são salvos em data.out ). O echo no final nunca será executado.

Portanto:

Altere a definição da sua função testPipe de maneira semelhante. Por exemplo:

function testPipe(){
        echo "va"
        cat
}

Isso terá o efeito de consumir a entrada e enviá-la para o próximo estágio do pipeline ou, se estiver no final de um pipeline, para onde a saída padrão for redirecionada após ela (com uma linha contendo o string va no início do fluxo).

    
por 07.07.2016 / 16:09