Não consegui o mkfifo
truque para funcionar satisfatoriamente; ele não pareceu capturar o stderr e as tentativas de redirecionamento fizeram com que o Upstart fosse liberado sem erros.
Ele também tem um efeito colateral lamentável de fazer com que o logger
processo permaneça como filho init
, de modo que as informações sobre quem é o proprietário do criador de logs são perdidas e qualquer pessoa que ainda não esteja ciente disso mkfifo
pode assumir que é um processo pendente que pode ser morto.
Em vez disso, acabei com a seguinte solução, que resolve todos esses problemas. Faz com logger
que se torne um processo filho, preservando o serviço como o processo raiz. Infelizmente, isso exige execução bash
, mas parece sujo.
script
# ... setup commands here, e.g. environment, cd, ...
exec bash <<EOT
exec 1> >(logger -t myservice) 2>&1
exec myservice
EOT
end script
Isso usa um truque que redireciona stdout e stderr para um comando. Como executamos o serviço dentro do bash
comando, isso tem o efeito colateral de substituir o shell e fazer do bash magicamente um processo filho do serviço, conforme mostrado por ps aufxw
:
myservice
\_ bash -c exec 1> >(logger -t myservice) 2>&1 && exec myservice
\_ logger -t myservice
Por alguma razão, o comando acima deve ser envolvido em a bash -c
. Presumo que isso ocorra porque o Upstart apenas finge executar seu script via Bash, mas na verdade não é. Se alguém puder sugerir uma maneira de evitar o shell bash extra, isso seria incrível.