Ich habe den mkfifo
Trick nicht bekommen , um zufriedenstellend zu arbeiten; Es schien kein stderr zu erfassen, und Versuche, es umzuleiten, führten dazu, dass Upstart ohne Fehler ausfiel.
Es hat auch den unglücklichen Nebeneffekt, dass der logger
Prozess als Kind herumlungert init
, sodass die Informationen darüber, wem der Logger "gehört", verloren gehen und jeder, der sich dessen noch nicht bewusst ist, mkfifo
davon ausgehen kann, dass es sich um einen baumelnden Prozess handelt, der getötet werden kann.
Stattdessen habe ich die folgende Lösung gefunden, die all diese Probleme behebt. Es wird logger
zu einem untergeordneten Prozess, während der Dienst als Stammprozess beibehalten wird. Leider muss es ausgeführt werden bash
, aber es sieht nur schmutzig aus.
script
# ... setup commands here, e.g. environment, cd, ...
exec bash <<EOT
exec 1> >(logger -t myservice) 2>&1
exec myservice
EOT
end script
Dies verwendet einen Trick, der stdout und stderr zu einem Befehl umleitet. Da wir den Service innerhalb des exec - bash
Befehl hat dies den Effekt , dass der Schale zu ersetzen und auf magische Weise machen bash ein Kind - Prozess des Dienstes werden, wie durch ps aufxw
:
myservice
\_ bash -c exec 1> >(logger -t myservice) 2>&1 && exec myservice
\_ logger -t myservice
Aus irgendeinem Grund muss der obige Befehl in a eingeschlossen werden bash -c
. Ich nehme an, dies liegt daran, dass Upstart nur vorgibt, Ihr Skript über Bash auszuführen, dies jedoch nicht wirklich ist. Wenn jemand einen Weg vorschlagen kann, um die zusätzliche Bash-Shell zu umgehen, wäre das großartig.