Em relação ao comando cmd1.sh | grep "message"
, em que cmd1.sh está como abaixo
#!/bin/bash
echo "message from foreground father proess$(date)"
setsid sleep 100 &
echo "message from foreground father proess$(date)"
echo "message from foreground father proess$(date)"
O processo pai iniciou um subprocesso em segundo plano sleep 100
e terminou antes do subprocesso
Você descobriria cmd1.sh
que funciona bem, mas cmd1.sh | grep "message"
trava e eu entendo que é porque o subprocesso se conecta ao pipe.
Então algum especialista poderia fornecer uma solução para sair cmd1.sh | grep "message"
sem alterar o cmd1.sh?
Você precisa de um comando que imprima tudo, mas interrompa o pipe após a mensagem de fim. Você pode usar
awk
:Se você não conseguir distinguir a última linha de nenhuma outra, você pode usar a
echo
para adicionar a sua própria:Todo o pipeline, que termina imediatamente após a última linha do binário original ser impressa:
Como não posso comentar, vou falar mais sobre Marco Guardigli aqui.
Em vez disso,
./cmd1.sh | tee logfile | grep message
você precisa executar o grep no arquivo de log:Não tenho certeza do que você está tentando alcançar com pg_ctl, mas acho que é melhor usar a infraestrutura do SO. O postgres geralmente é iniciado por meio de um serviço systemd, então você deve fazer
sysmtectl restart postgres
, ou em um contêiner docker, então é melhor reiniciar todo o contêiner. Dessa forma, você também podegrep
os logs dos daemons (journalctl
oudocker logs
)Acho que você poderia usar uma camiseta.
comando1 | tee comando1.saída | comando2
desvincularia o comando1 do destino do comando2.
Em um pipe simples C1 | C2, C1 recebe um SIGPIPE se C2 morre.
tee não propaga SIGPIPE para command1, e a saída command1 seria salva por tee no arquivo command1.output
Graças ao tee, o que quer que você faça com o command2 não deve afetar os processos bifurcados do command1.