Non ho avuto il mkfifo
trucco per funzionare in modo soddisfacente; non sembrava catturare stderr e i tentativi di reindirizzamento hanno causato il caos di Upstart senza errori.
Ha anche uno sfortunato effetto collaterale di far logger
sospendere il processo da bambino init
, quindi le informazioni su chi "possiede" il logger sono perse e chiunque non sia già a conoscenza di ciò mkfifo
potrebbe presumere che sia un processo penzolante che può essere ucciso.
Invece ho finito con la seguente soluzione, che risolve tutti questi problemi. Fa logger
diventare un processo figlio, preservando il servizio come processo principale. Sfortunatamente, richiede l'esecuzione bash
, ma sembra solo sporco.
script
# ... setup commands here, e.g. environment, cd, ...
exec bash <<EOT
exec 1> >(logger -t myservice) 2>&1
exec myservice
EOT
end script
Questo usa un trucco che reindirizza stdout e stderr a un comando. Poiché eseguiamo il servizio all'interno del bash
comando, questo ha l'effetto collaterale di sostituire la shell e rendere magicamente bash un processo figlio del servizio, come mostrato da ps aufxw
:
myservice
\_ bash -c exec 1> >(logger -t myservice) 2>&1 && exec myservice
\_ logger -t myservice
Per qualche motivo il comando sopra deve essere racchiuso in a bash -c
. Suppongo che ciò avvenga perché Upstart finge solo di eseguire il tuo script tramite Bash, ma in realtà non lo è. Se qualcuno può suggerire un modo per evitare la shell bash extra, sarebbe fantastico.