Tenho o seguinte comando:
sudo docker logs -f <id> | awk '/Listening on / {print $3; exit 0;}'
Pelo que entendi, o awk deve encontrar a primeira linha que corresponde ao padrão, imprimir a coluna correta e sair. No entanto, isso nem sempre acontece: na maioria das vezes ele simplesmente imprime a coluna correta e trava, embora ocasionalmente saia corretamente.
eu tentei
$ sudo stdbuf -i0 -o0 -e0 docker logs ... # hangs
$ sudo docker logs ... | cat | awk ... # hangs
Ao tentar produzir um exemplo mínimo, também tentei fazer um pipe usando mkfifo
, e usando cat foo | awk ...
mas isso não trava.
A saída de docker logs -f <id>
é
Listening on 172.17.0.2/16
...
e então ele permanece aberto, mas não escreve mais nada.
Eu não entendo o que está acontecendo - alguém tem alguma idéia?
De
man bash
:Eu não tenho o docker instalado, mas talvez tente isso:
Ou você pode tentar isso:
Então talvez uma explicação do que está acontecendo ajude. Estou assumindo que o comando 'docker logs' normalmente não sai (o -f == segue?).
O problema original surge porque o pipeline não está saindo no término do awk - isso ocorre porque o pipeline ainda está aguardando o programa docker (veja meu extrato acima da página de manual do bash).
O pkill simplesmente mata qualquer coisa que tenha o ID do pai $$ - ou seja, naquele momento, isso é apenas docker.
Obviamente, não seria uma boa ideia jogar esse comando em segundo plano com '&' e depois executar outras coisas - eles também seriam mortos!