Quebra e reinicia o comando do Linux quando um texto específico aparece

3

Para simplificar a situação o máximo possível, digamos que eu esteja seguindo um arquivo de log que é rotacionado quando ocorre um desligamento do aplicativo. Desde que o arquivo muda, a cauda pára. Para continuar a cauda, é necessária uma interrupção do teclado e, em seguida, o comando é executado novamente. Aqui está um exemplo:

$ tail -f some-log-file.log
log line
log line
...etc...
log line
log line
Some app restarting...
^C
$ tail -f some-log-file.log
log line
log line
...etc...

Então, o que eu gostaria de encontrar é uma maneira simples de reiniciar a cauda quando o texto "Some app restarting ..." for encontrado. Eu pensei em programas que eu poderia escrever para monitorar processos ou similares, mas eu sinto que isso deve ser possível como um script de uma linha ou short bash. Alguma idéia?

    
por mVChr 23.02.2017 / 19:56

1 resposta

3
while true; do
  sed '/Some app restarting/q' <(exec tail -f some-log-file.log)
  kill -9 $!
done

Aqui está um resumo do que isso faz:

  • while true; do : inicia um loop infinito
  • sed '/Some app restarting/q' : envia sua entrada para sua saída e termina quando recebe "Reinicialização de alguns aplicativos"
  • <(command) : execute comando em um subshell em segundo plano e forneça sua saída para o comando anterior
  • exec : substitua o shell (sub) pelo seguinte comando, em vez de forking para executá-lo
  • kill -9 $! : mata o processo de segundo plano mais recente iniciado, que é o tail -f (sem isso, parece que funciona, mas um processo final será deixado permanentemente toda vez que o aplicativo for reiniciado)
  • done : finaliza o loop infinito
por 23.02.2017 / 22:29