Pare uma tarefa com base na saída

4

Eu tenho uma tarefa que é executada em Mono, no entanto, às vezes (aleatoriamente), o tempo de execução do Mono é interrompido depois que a tarefa é concluída e apenas imprime:

_wapi_handle_ref: Attempting to ref unused handle 0x2828
_wapi_handle_unref_full: Attempting to unref unused handle 0x2828
_wapi_handle_ref: Attempting to ref unused handle 0x2828
_wapi_handle_unref_full: Attempting to unref unused handle 0x2828
...

para stderr para sempre. Existe uma maneira de analisar stderr e matar a tarefa quando um determinado padrão é correspondido?

Um tempo limite está fora de questão porque a tarefa pode levar mais de uma hora para ser concluída normalmente, mas se não houver trabalho a ser feito, a saída será instantânea (ou pelo menos deveria ser).

    
por Ivan Neeson 31.07.2013 / 05:17

1 resposta

3
{ 
  my-mono-app 2>&1 >&3 3>&1 | awk '
    {print}
    /ref unused/ {print "Exiting."; exit(1)}' >&2
} 3>&1

awk sairá assim que ler uma dessas mensagens, fazendo com que my-mono-app seja eliminado por SIGPIPE da próxima vez que tentar escrever algo no stderr.

Não use mawk lá que buffers stdin de maneira estúpida (ou use -W interactive ).

Se o aplicativo não morrer no SIGPIPE, você terá que matá-lo de alguma forma.

Um caminho pode ser:

{ sh -c 'echo "$$" >&2; exec my-mono-app' 2>&1 >&3 3>&1 | awk '
  NR == 1 {pid = $0; next}
  {print}
  /ref unused/ && ! killed {
     print "Killing",pid
     killed=1
     system("kill " pid)
  }' >&2
} 3>&1

Substitua por "kill " por "kill -s KILL " se ainda não funcionar.

    
por 31.07.2013 / 08:22

Tags