No conseguí el mkfifo
truco para funcionar satisfactoriamente; no parecía capturar stderr, y los intentos de redirigir causaron que Upstart salga sin ningún error.
También tiene un efecto secundario desafortunado de hacer que el logger
proceso se quede como un niño init
, por lo que la información sobre quién "posee" el registrador se pierde, y cualquiera que no esté al tanto de esto mkfifo
podría suponer que es un proceso pendiente que se puede matar.
En cambio, terminé con la siguiente solución, que resuelve todos estos problemas. Hace logger
que se convierta en un proceso hijo, al tiempo que conserva el servicio como el proceso raíz. Desafortunadamente, requiere ejecución bash
, pero se ve sucio.
script
# ... setup commands here, e.g. environment, cd, ...
exec bash <<EOT
exec 1> >(logger -t myservice) 2>&1
exec myservice
EOT
end script
Esto utiliza un truco que redirige stdout y stderr a un comando. Como ejecutamos el servicio dentro del bash
comando, esto tiene el efecto secundario de reemplazar el shell y hacer que bash se convierta mágicamente en un proceso secundario del servicio, como se muestra en ps aufxw
:
myservice
\_ bash -c exec 1> >(logger -t myservice) 2>&1 && exec myservice
\_ logger -t myservice
Por alguna razón, el comando anterior tiene que estar envuelto en a bash -c
. Supongo que esto se debe a que Upstart solo pretende ejecutar su script a través de Bash, pero en realidad no lo es. Si alguien puede sugerir una forma de evitar el shell de bash extra, sería genial.