Ich verwende ein Init-Skript, um einen einfachen Prozess auszuführen, der gestartet wird mit:
start-stop-daemon --start --quiet --chuid $DAEMONUSER \
--make-pidfile --pidfile $PIDFILE --background \
--exec $DAEMON $DAEMON_ARGS
Der Prozess mit dem Namen $ DAEMON druckt normalerweise Protokollinformationen in die Standardausgabe. Soweit ich das beurteilen kann, werden diese Daten nirgendwo gespeichert.
Ich möchte den Standard von $ DAEMON irgendwo an eine Datei schreiben oder anhängen.
Die einzige Lösung, die ich kenne, besteht darin, start-stop-daemon anzuweisen, ein Shellscript anstelle von $ DAEMON direkt aufzurufen. Das Skript ruft dann $ DAEMON auf und schreibt in die Protokolldatei. Dies erfordert jedoch ein zusätzliches Skript, das wie das Ändern des Dämons selbst der falsche Weg ist, um eine solche häufige Aufgabe zu lösen.
quelle
--start
durch--stop
tatsächlich funktioniert.start-stop-daemon --test (...)
aussehen?>>
statt>
zum Anhängen.Sie müssen tun:
Auch wenn Sie
--chuid
oder verwenden--user
, stellen Sie sicher, dass der Benutzer auf/var/log
oder das vorhandene schreiben kann/var/log/some.log
. Der beste Weg ist, dass dieser Benutzer ein/var/log/subdir/
obwohl besitzt.quelle
bashPID=$(cat $PIDFILE); [ -n "$bashPID" ] && pkill -P "$bashPID"
pkill
Lösung auch. Ich... -c "exec $DAEMON..."
frage mich, was ich tun würde (Hinzufügen des "exec"). Habe das jetzt noch nicht auf dem Teller, also kann ich es nicht probieren.Es scheint, dass Sie jetzt in der Lage sein sollten, den
--no-close
Parameter zu verwenden, wenn Siestart-stop-daemon
mit der Erfassung der Daemon-Ausgabe beginnen. Diese neue Funktion ist imdpkg
Paket seit Version 1.16.5 unter Debian verfügbar :quelle
start-stop-daemon
. Die openrc-Version verfügt jedoch über die Optionen-1
und-2
, um stdout bzw. stderr umzuleiten.Mit openrc (das ist die Standardeinstellung unter Gentoo oder Alpin Linux) stehen
start-stop-daemon
die Optionen-1
und-2
zur Verfügung:Sie können also einfach schreiben:
quelle
Es ist nicht allzu schwer, die Ausgabe des Dämons zu erfassen und in einer Datei zu speichern:
Diese Lösung kann jedoch für nicht optimal sein
logrotate
.Es ist möglicherweise besser, die Ausgabe in Syslog zu erfassen. Unter Debian würde dies dem Verhalten von systemd-Diensten entsprechen. Der folgende einfache Versuch, das obige Beispiel neu zu schreiben, ist falsch, da nach dem Stoppen des Daemons zwei übergeordnete Prozesse ("Zombie") (Logger und Daemon) zurückbleiben, da
start-stop-daemon
nur sein untergeordnetes Element, aber nicht alle Nachkommen beendet werden:Damit es funktioniert, benötigen wir einen Wrapper, der seine untergeordneten Elemente beim Empfang
duende :SIGTERM
von beendetstart-stop-daemon
. Dort sind einige:Hinweis:
uid=65534
ist ein Benutzernobody
.Vorteile : Es funktioniert und es ist relativ einfach.
Daemon :Nachteile : 4 Prozesse (Supervisor
duende
, Fork mit verworfenen Berechtigungen (Logger)su
und Daemon selbst); obligatorisch--chroot
; Wenn der Dämon sofort beendet wird (z. B. ungültiger Befehl),status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
melden Sie ihn als erfolgreich gestartet.Pros : 3 - Prozesse (Supervisor
daemon
,su
und Dämon selbst).Nachteile :
$PIDFILE
Aufgrund der verwirrenden Befehlszeilenoptionen des Dämons schwierig zu verwalten . Wenn der Dämon sofort beendet wird (z. B. ungültiger Befehl),status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
melden Sie ihn als erfolgreich gestartet.pipexec ( der Gewinner ):
Pros : 3 - Prozesse (Supervisor
pipexec
,logger
und Daemon selbst); Wenn der Daemon sofort beendet wird (z. B. ungültiger Befehl)status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
, melden Sie den Fehler korrekt.Nachteile : keine.
Dies ist der Gewinner - die einfachste und ordentlichste Lösung, die anscheinend gut funktioniert.
quelle
start-stop-daemon
Schließt normalerweise die Standard-Dateideskriptoren, wenn sie im Hintergrund ausgeführt werden. Aus der Manpage vonstart-stop-daemon
:Dieser hat für mich gearbeitet:
quelle
Zitieren einer alten Mailingliste:
https://lists.ubuntu.com/archives/ubuntu-uk/2005-June/000037.html
quelle
Ich bin nicht sicher, ob "$ DAEMON $ DAEMON_ARGS> /var/log/some.log 2> & 1" jemals den Dateideskriptor für die Protokolldatei schließen wird. Wenn Ihr Daemon also für immer ausgeführt wird, bin ich mir nicht sicher Diese Protokollierung oder andere Mechanismen zum Bereinigen des Speicherplatzes würden funktionieren. Da es> statt >> ist, würde der vorgeschlagene Befehl beim Neustart auch vorhandene Protokolle abschneiden. Wenn Sie sehen möchten, warum der Dämon abgestürzt ist und automatisch neu gestartet wird, ist dies möglicherweise nicht sehr hilfreich.
Eine andere Option könnte "$ DAEMON | logger" sein. logger ist ein Befehl, der in syslog (/ var / log / messages) protokolliert wird. Wenn Sie auch stderr benötigen, können Sie "$ DAEMON 1> & 2 | logger" verwenden.
quelle
>>
ist im Allgemeinen besser für Dämonen geeignet, obwohl dies impliziert, dass Sie jetzt eine Logrotate-Regel erstellen sollten!--no-close ... | logger
funktioniert bei mir nicht (Debian 7.3, Start-Stop-Daemon 1.16.12). Das Start-Stopp-Daemon-Skript wird nicht zurückgegeben, obwohl / var / log / messages gefüllt ist :-). Ich habe es mit und ohne versucht1>&2
.Angenommen, es ist Bash (obwohl einige andere Shells dies ebenfalls zulassen), lautet die Zeile:
sendet alle zukünftigen Standardausgaben an diese Datei. Das liegt daran, dass
exec
ohne Programmnamen nur Umleitungszauber ausgeführt wird. Von derbash
Manpage:Die Verwaltung dieser Datei ist natürlich ein weiteres Problem.
quelle
start-stop-daemon
Zeile, die in der ersten Frage erwähnt wurde?Wie wäre es mit:
quelle