Assumindo o seguinte comando fictício no bash:
### dummy long_operation_cmd function, for easy reproduction:
function long_operation_cmd() {
echo "operation 1"
sleep 5
echo "operation 2"
}
Atualmente estou executando um script bash da seguinte maneira:
{
long_operation_cmd
echo '===ALL DONE==='
} > /tmp/logfile.tmp &
tail -f /tmp/logfile.tmp | sed '/^===ALL DONE===$/ q' \
&& rm /tmp/logfile.tmp
Isso me permite executar a operação longa com segurança em segundo plano, rastrear a saída e garantir que Ctrl+C não interrompa a execução.
Mais importante ainda, quando a operação é feita, sed
me tira do modo de acompanhamento.
Eu quero substituir tail -f
por less +F
, e foi isso que eu criei:
{
long_operation_cmd
echo '===ALL DONE==='
} > /tmp/logfile.tmp &
less +F -- /tmp/logfile.tmp \
&& rm /tmp/logfile.tmp
No entanto, não consigo descobrir uma maneira de sair do modo de acompanhamento automaticamente quando o ===ALL DONE===
padrão é atingido (ou quando a long_operation_cmd
operação é concluída).
Alguma sugestão para resolver isso?
Você pode enviar ao processo um sinal SIGINT quando "ALL DONE":
que, no entanto, exigiria que você conhecesse o PID (executado
less +F
em segundo plano também?).Parece que vou seguir um caminho diferente.
Eu vou
tail -f
primeiro, prender o Ctrl-C, e menos depois. Se tudo estiver bem, não executareiless
, mas setail
'falhar' (que é o caso de Ctrl + C sendo usado), iniciarei menos - poderia continuar com 'F' de dentro de menos, se necessário.O resultado final ficará assim: