Je n'ai pas eu l' mkfifo
astuce pour travailler de manière satisfaisante; il n'a pas semblé capturer stderr et les tentatives de redirection ont amené Upstart à se libérer sans erreur.
Cela a également un effet secondaire malheureux: le logger
processus est suspendu en tant qu'enfant init
. Ainsi, les informations sur le propriétaire de l'enregistreur sont perdues, et quiconque n'est pas déjà au courant mkfifo
peut supposer qu'il peut s'agir d'un processus en suspens.
Au lieu de cela, je me suis retrouvé avec la solution suivante, qui résout tous ces problèmes. Il en résulte logger
un processus enfant tout en préservant le service en tant que processus racine. Malheureusement, il faut exécuter bash
, mais ça a l' air sale.
script
# ... setup commands here, e.g. environment, cd, ...
exec bash <<EOT
exec 1> >(logger -t myservice) 2>&1
exec myservice
EOT
end script
Cela utilise une astuce qui redirige stdout et stderr vers une commande. Comme nous exécutons le service dans la bash
commande, cela a pour effet secondaire de remplacer le shell et de faire de bash, comme par magie, un processus enfant du service, comme indiqué par ps aufxw
:
myservice
\_ bash -c exec 1> >(logger -t myservice) 2>&1 && exec myservice
\_ logger -t myservice
Pour une raison quelconque, la commande ci-dessus doit être encapsulée dans un bash -c
. Je suppose que c'est parce qu'Uststart prétend seulement exécuter votre script via Bash, mais ce n'est pas le cas. Si quelqu'un pouvait suggérer un moyen d'éviter le shell extra bash, ce serait génial.