Ich habe einen benutzerdefinierten Daemon, der von Upstart auf meinem Ubuntu-Server verwaltet wird. Es funktioniert einwandfrei, außer dass ich die Ausgabe des Daemons erfassen (protokollieren) muss. Auf der offiziellen Strophenseite heißt es, dass ich das console logged
tun kann, aber in welche Datei wird das Protokoll geschrieben?
Ich habe auch gelesen , dass console logged
ist nicht mehr eine gültige Strophe . Ich verwende derzeit 0.3.9 (Hardy), werde aber in ein paar Monaten auf 0.6.x (Lucid) upgraden. console logged
Was verwende ich stattdessen, wenn es in späteren Versionen nicht funktioniert?
Antworten:
Dieses Snippet leitet die Ausgabe Ihres Dienstes an Logger weiter, während Sie weiterhin den Dienstprozess ausführen können (wodurch der Shell-Prozess ersetzt wird), damit der Start nicht verwirrt wird. Es stellt auch sicher, dass der Logger-Prozess auf init zurückgesetzt wird, damit er nicht zu Ihren Diensten gehört, und verhindert, dass cruft im Dateisystem herumsteht, obwohl es vorübergehend erforderlich ist, ein FIFO zu erstellen.
So funktioniert das:
mkfifo /tmp/myservice-log-fifo
macht einfach die fifo spezial datei (aka named pipe). Geben Sieman 7 fifo
für weitere Informationen.( logger ... </tmp/myservice-log-fifo & )
Startet den Logger-Lesevorgang vom FIFO im Hintergrund. Die Parens bewirken, dass der Logger-Prozess erneut an init gesendet wird, anstatt ein Kind des aktuellen Shell-Prozesses zu bleiben.exec >/tmp/myservice-log-fifo
Leitet die Standardausgabe der aktuellen Shell an das FIFO um. Jetzt haben wir einen offenen Dateideskriptor für dieses FIFO und brauchen den Dateisystemeintrag nicht mehr ...rm /tmp/myservice-log-fifo
Also werden wir es entfernen.exec myservice 2>/dev/null
führt den Dienst einfach auf die übliche Weise aus. Stdout geht bereits zum FIFA, und das wird sich nicht ändern, wenn das neue Programm ausgeführt wird.UPDATE:
set -e
wird nicht benötigt, da Upstart standardmäßig Skripte mit dieser Option ausführt (siehe http://upstart.ubuntu.com/cookbook/#develop-scripts-using-bin-sh )quelle
set -e
?set -e
bewirkt , dass das Skript sofort beenden , wenn ein Befehl fehlschlägt. Ohne diese Zeile würde das Skript nachfolgende Befehle weiterhin nutzlos (und möglicherweise gefährlich) ausführen.exec 2>&1
über derrm
Zeile hinzu und entfernen Sie die2>/dev/null
von der letzten Zeile.Für aktuelle Ubuntu-Versionen (12.04+) verwenden Sie einfach
Die Daemon-Ausgabe (STDOUT & STDERR) wird angehängt
/var/log/upstart/<service>.log
http://upstart.ubuntu.com/cookbook/#console-log
quelle
Wenn Sie die
console output
Zeilengruppe verwenden und die Ausgabe Ihres Skripts anlogger
(die Shell-Befehlsschnittstelle zum Systemprotokollmodul syslog (3)) weiterleiten, funktioniert dies.Beispielsweise
wird sich anmelden bei
/var/log/messages
Beispielsweise
loggt sich in
/var/log/messages
jede Nachricht ein und markiert sie mitmy-script
logger --help
für Logger-Nutzungsoptionen.(Ich verwende Amazon Linux AMI, das auf Centos 5.x basiert; YMMV)
quelle
logger
und nicht von dem Prozess, den Sie tatsächlich verwalten möchten.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 herumlungertinit
, 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 werdenbash
, aber es sieht nur schmutzig aus.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 durchps aufxw
: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.quelle
exec bash -l << EOF
damit keinen Verlust.Das ist hässlich aber bisher das beste was ich gefunden habe
exec / path / to / server >> /tmp/upstart.log 2> & 1
quelle
Sie können die Ausgabe auch an syslog umleiten, z
Die Pipeline kann jedoch dazu führen, dass der Start die PID des Protokollierungsprozesses mit der PID des Dämons verwechselt.
quelle
expect fork
oder wollenexpect daemon
. Oder du könntestcat
die PID-Datei in die Log-Nachricht sonst, denke ich.Eine andere Alternative ist die Verwendung von Tee wie:
um sowohl die Upstart-Datei als auch die Syslog-Ausgabe zu erhalten
quelle