grep falha no script inicial

4

Eu tenho uma configuração inicial para um serviço que precisa verificar a existência de um processo em sua inicialização. Isso parece bastante fácil, mas eu já estou tentando por 3 horas para resolver isso e estou perdido. O problema parece ser que algumas instruções do grep levam a uma saída do script dentro do upstart, levando a uma falha no início do serviço. Mas o upstart não registra nada, apenas sai do script e desaparece.

A seguir estão algumas linhas de exemplo que desencadeiam o problema: O primeiro eco e a saída do grep são registrados, o segundo eco é registrado, mas não a saída do grep. Após o segundo eco inicial, apenas sai do script e pára. O problema é adicionar a opção -v ou algo parecido com o uso de classes regexp como [[: digit:]]. Parece que eu preciso escapar de alguns personagens, mas eu simplesmente não sei como. Um simples -v ou algo assim não funciona.

script
  echo grep
  ps ax | grep "postgres: wal writer process" | grep "grep"
  echo grep2
  ps ax | grep "postgres: wal writer process" | grep -v "grep"
end script

Alguém tem uma ideia do que estou fazendo errado e como corrigir o problema?

    
por Thorsten Schöning 16.05.2013 / 20:16

1 resposta

5

Como explicado no manual , todos os scripts são executados com sh -e . Isso significa que qualquer falha de comando não tratada terminará o script com um erro. Se você tem código que pode retornar falha, você codifica como

command || true

ou envolvê-lo em um condicional ou algo assim.

A propósito, seu código é melhor escrito como

ps ax | grep "[p]ostgres: wal writer process"

Veja também link

Então, em resumo, você provavelmente estaria procurando algo como

if ps aux | grep '[p]ostgres: wal writer process'
then
    : already running
else
    : start it up
fi

Agora que grep é executado como parte de uma condicional, uma falha não é mais considerada sem tratamento (mesmo se você não tiver uma cláusula else !) e, portanto, ela será executada com segurança em set -e . / p>     

por 16.05.2013 / 20:23