Comando tail -f não roda dentro de um script

1. Comando tail -f não roda dentro de um script

Gleiton Campos
StuardBr

(usa Ubuntu)

Enviado em 05/06/2017 - 10:28h

Bom dia pessoas!!
Venho hoje pedir auxilio em um questão curiosa que esta acontecendo.

Estou fazendo um trabalho com arduino, onde preciso ler a serial do mesmo de forma continua, para sempre receber os dados. Preciso salvar o output da serial em um txt, de forma que nesse txt sempre tenha APENAS a ultima linha lida.
Ate aí tudo bem, usei a combinação a seguir e consegui fazer o que preciso:

cat /dev/ttyUSB0 | tee <(tail -n 1 < /home/user/log.txt) 


O comando acima pega o resultado do cat, joga no tee, que me exibe na tela, depois joga no tail, onde ele pega apenas a ultima linha e joga dentro de /home/user/log.txt.

Se eu executo isso do terminal, como root, ele faz exatamente o que tem que fazer. Então resolvi coloca-lo em um scrip, pra facilitar a execução:
#!/bin/bash
echo "Iniciando leitura da serial e salvando em arquivo"
while true; do
cat /dev/ttyUSB0 | tee <(tail -n 1 < /home/user/log.txt)
done


Se eu fizer isso, ele funciona ate a parte do tee, mas o arquivo /home/user/log.txt permanece vazio. Fiz alguns testes separando o codigo e executando por partes e o tail parece não funcionar dentro do script. Se eu usar um input e output diferentes, funciona normalmente.

Alguem poderia me dar uma luz? Obrigado!



  


2. Re: Comando tail -f não roda dentro de um script

Osama Jr.
/bin/laden

(usa Void Linux)

Enviado em 05/06/2017 - 14:51h

Depure o script pra ver o que tá acontecendo!

bash -xv seu_script.sh 



3. Re: Comando tail -f não roda dentro de um script

Gleiton Campos
StuardBr

(usa Ubuntu)

Enviado em 05/06/2017 - 21:37h

/bin/laden escreveu:

Depure o script pra ver o que tá acontecendo!

bash -xv seu_script.sh 


Executei a depuração e obtive isso:

root@LAMP:/home/lamp# bash -xv ./arduino.sh 
#!/bin/bash

while true; do
cat /dev/ttyUSB0 |tee >(tail -n 1 > /home/lamp/leitura.txt)
done
+ true
+ cat /dev/ttyUSB0
+ tee /dev/fd/63
tail -n 1 > /home/lamp/leitura.txt
++ tail -n 1
0.00 8742.59 0 0
0.00 8759.71 0 0
.. .. .. .. .. .. ..


Aparentemente, ele exceuta ate o tail -n 1 , mas n puxa o arquivo destino. Existe alguma maneira de "forçar" o arquivo?





4. Re: Comando tail -f não roda dentro de um script

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 05/06/2017 - 22:02h

Boa noite.
Atente-se que o "tee" não usa direcionador, exemplo
echo "Viva o Linux"|tee arquivo
Ou
echo "Viva o Linux"|tee -a arquivo
Qto a sintaxe:
cat /dev/ttyUSB0 | tee <(tail -n 1 < /home/user/log.txt) 

Tá muito louca . . . rsrsrs
O "tee" recebe do pipe e do < . . .
Faça em duas partes....
#MOSTRA
cat /dev/ttyUSB0
#GRAVA
tail -n1 /dev/ttyUSB0 > /home/user/log.txt
Ou
tail -n1 /dev/ttyUSB0 | tee /home/user/log.txt) 


marcelo oliver


5. Re: Comando tail -f não roda dentro de um script

Gleiton Campos
StuardBr

(usa Ubuntu)

Enviado em 06/06/2017 - 21:54h

msoliver escreveu:

Boa noite.
Atente-se que o "tee" não usa direcionador, exemplo
echo "Viva o Linux"|tee arquivo
Ou
echo "Viva o Linux"|tee -a arquivo
Qto a sintaxe:
cat /dev/ttyUSB0 | tee <(tail -n 1 < /home/user/log.txt) 

Tá muito louca . . . rsrsrs
O "tee" recebe do pipe e do < . . .
Faça em duas partes....
#MOSTRA
cat /dev/ttyUSB0
#GRAVA
tail -n1 /dev/ttyUSB0 > /home/user/log.txt
Ou
tail -n1 /dev/ttyUSB0 | tee /home/user/log.txt) 


marcelo oliver


E ai Marcelo!

Obrigado pela resposta!Vamos la:

1- Não sabia que o tee não aceitava redirecionadores... Estranho q ele esta funcionando assim normalmente, mas vou evitar usa-lo. Obrigado pelo toque;

2- A minha sintaxe você transcreveu errada, o redirecionador esta para o outro lado, PEGANDO do tee e n entregando a ele;

3- Fazer em duas partes nem seria necessário, preciso mesmo é do arquivo com uma linha só. Os problemas são:
a) O tail não lê a serial/USB, então tenho q usar ele depois do primeiro comando, que seria o CAT.
b)Tentei usar o ttylog, mas ele adiciona uma linha em branco depois de toda leitura, o que torna inviável, pois como preciso de apenas uma linha no txt, a ultima linha será sempre em branco.
c) Se eu usar o cat + tail, por algum motivo, o tail esta dando append no txt, o que me deixa com mais de 1 linha.

PS: Se eu tirar o redirecionado do tee, ele n entrega os dados ao tail, dando um erro de sintaxe.


6. Re: Comando tail -f não roda dentro de um script

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 07/06/2017 - 18:55h

StuardBr escreveu:

msoliver escreveu:

Boa noite.
Atente-se que o "tee" não usa direcionador, exemplo
echo "Viva o Linux"|tee arquivo
Ou
echo "Viva o Linux"|tee -a arquivo
Qto a sintaxe:
cat /dev/ttyUSB0 | tee <(tail -n 1 < /home/user/log.txt) 

Tá muito louca . . . rsrsrs
O "tee" recebe do pipe e do < . . .
Faça em duas partes....
#MOSTRA
cat /dev/ttyUSB0
#GRAVA
tail -n1 /dev/ttyUSB0 > /home/user/log.txt
Ou
tail -n1 /dev/ttyUSB0 | tee /home/user/log.txt) 


marcelo oliver


E ai Marcelo!

Obrigado pela resposta!Vamos la:

1- Não sabia que o tee não aceitava redirecionadores... Estranho q ele esta funcionando assim normalmente, mas vou evitar usa-lo. Obrigado pelo toque;

2- A minha sintaxe você transcreveu errada, o redirecionador esta para o outro lado, PEGANDO do tee e n entregando a ele;

3- Fazer em duas partes nem seria necessário, preciso mesmo é do arquivo com uma linha só. Os problemas são:
a) O tail não lê a serial/USB, então tenho q usar ele depois do primeiro comando, que seria o CAT.
b)Tentei usar o ttylog, mas ele adiciona uma linha em branco depois de toda leitura, o que torna inviável, pois como preciso de apenas uma linha no txt, a ultima linha será sempre em branco.
c) Se eu usar o cat + tail, por algum motivo, o tail esta dando append no txt, o que me deixa com mais de 1 linha.

PS: Se eu tirar o redirecionado do tee, ele n entrega os dados ao tail, dando um erro de sintaxe.

Boa noite.
Não me expressei corretamente....
1 - O "tee" aceita redirecionamento!
2 - cat /dev/ttyUSB0 | tee <(tail -n 1 < /home/user/log.txt)
O "pipe" direciona o conteudo de /dev/ttyUSB0 p/ o TEE
O SINAL< Envia da Direita p/ a Esquerda
O outro < não é necessário
tail -n1 /home/user/log.txt

att.:
mso


7. Re: Comando tail -f não roda dentro de um script

Gleiton Campos
StuardBr

(usa Ubuntu)

Enviado em 09/06/2017 - 13:13h

msoliver escreveu:

StuardBr escreveu:

msoliver escreveu:

Boa noite.
Atente-se que o "tee" não usa direcionador, exemplo
echo "Viva o Linux"|tee arquivo
Ou
echo "Viva o Linux"|tee -a arquivo
Qto a sintaxe:
cat /dev/ttyUSB0 | tee <(tail -n 1 < /home/user/log.txt) 

Tá muito louca . . . rsrsrs
O "tee" recebe do pipe e do < . . .
Faça em duas partes....
#MOSTRA
cat /dev/ttyUSB0
#GRAVA
tail -n1 /dev/ttyUSB0 > /home/user/log.txt
Ou
tail -n1 /dev/ttyUSB0 | tee /home/user/log.txt) 


marcelo oliver


E ai Marcelo!

Obrigado pela resposta!Vamos la:

1- Não sabia que o tee não aceitava redirecionadores... Estranho q ele esta funcionando assim normalmente, mas vou evitar usa-lo. Obrigado pelo toque;

2- A minha sintaxe você transcreveu errada, o redirecionador esta para o outro lado, PEGANDO do tee e n entregando a ele;

3- Fazer em duas partes nem seria necessário, preciso mesmo é do arquivo com uma linha só. Os problemas são:
a) O tail não lê a serial/USB, então tenho q usar ele depois do primeiro comando, que seria o CAT.
b)Tentei usar o ttylog, mas ele adiciona uma linha em branco depois de toda leitura, o que torna inviável, pois como preciso de apenas uma linha no txt, a ultima linha será sempre em branco.
c) Se eu usar o cat + tail, por algum motivo, o tail esta dando append no txt, o que me deixa com mais de 1 linha.

PS: Se eu tirar o redirecionado do tee, ele n entrega os dados ao tail, dando um erro de sintaxe.

Boa noite.
Não me expressei corretamente....
1 - O "tee" aceita redirecionamento!
2 - cat /dev/ttyUSB0 | tee <(tail -n 1 < /home/user/log.txt)
O "pipe" direciona o conteudo de /dev/ttyUSB0 p/ o TEE
O SINAL< Envia da Direita p/ a Esquerda
O outro < não é necessário
tail -n1 /home/user/log.txt

att.:
mso

No meu codigo os SINAIS estão para o outro lado, mandando da ESQUERDA para a DIREITA , então ele PEGA do tee e JOGA no tail. Foi uma falha de digitação da minha parte, me desculpe

cat /dev/ttyUSB0 | tee >(tail -n 1 > /home/user/log.txt) 







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts