por que meu script init.d parece rodar como se tivesse sido executado?

0

Estou vendo um script init.d escrito por um colega de trabalho anterior que não está funcionando corretamente agora. Está rodando em centos-6

Após algumas experiências, encontrei a causa do problema. Ele escreveu o script para esperar até 30 segundos por um comando kill -TERM para runciton antes de relatar um erro. Para fazer isso, ele está executando o comando:

kill -0 $pid

para testar se o programa morto morreu ainda.

O comando kill -0 está jogando um erro:

/etc/init.d/celerybeat line 211: kill (<pid>) - No such process

então existe imediatamente após esta linha falhar.

Isto é o que eu esperaria com set -e, mas o script não roda set -e. Na verdade, ele tem a linha comentada com um comentário dizendo que o comando kill -0 falhará se estiver definido, então ele estava muito consciente de que não queria que fosse definido.

Isso acontece mais eu o executo via serviço ou executo o script diretamente do diretório /etc/init.d

Então ... por que o script está sendo executado como se set -e estivesse definido? e, mais importante, como evito que ele seja executado dessa maneira ou reescreva a linha para verificar se o pid está sendo executado sem gerar uma exceção?

    
por dsollen 25.07.2017 / 16:41

1 resposta

1

Você pode desativar o "exit on error" com set +e ou set +o errexit ou executar o comando em um condicional para que a saída de erro não se aplique. Mais simples seria:

somecmd ... || true

Mas isso destruiria o valor de retorno, e você provavelmente precisará dele, pois kill -0 não faz muito além de configurá-lo. Então, talvez algo assim:

if kill -0 "$pid" 2>/dev/null ; then
    echo it lives
fi

Quanto ao "porquê", acho que o CentOS 6 executa o Upstart, e pelo menos alguma documentação do Ubuntu parece indicar que o Upstart executa scripts com set -e ativado.

    
por 25.07.2017 / 16:53