Stdout / stderr leitet im Start-Stopp-Daemon um

8

Ich versuche, eine initKonfiguration zu schreiben , die die Ausgabe meines Daemons in zwei Dateien umleitet (für stdout und stderr). Das Problem ist, es funktioniert nicht. Ich lese das gerade.

Also habe ich dieses Shell-Skript erstellt, um diesen Ansatz zu testen. Und es funktioniert nicht:

PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Seed kurokikaze starter"
#NAME=node
DAEMON="/etc/node-version/0.1.99/bin/node"
DAEMON_ARGS="/etc/seed/kurokikaze/server.js"
DAEMON_DIR="/etc/seed/kurokikaze"

APPLOG_FILE="/var/log/seed/kurokikaze"
ERRLOG_FILE="/var/log/seed/kurokikaze-err"

PIDFILE="/var/run/seeds/kurokikaze.pid"
SCRIPTNAME="/etc/seed-init/kurokikaze"

NCMD="exec $DAEMON $DAEMON_ARGS 1>>$APPLOG_FILE 2>>$ERRLOG_FILE"

start-stop-daemon -Sbmv --pidfile $PIDFILE --chdir ${DAEMON_DIR} --exec $DAEMON --startas /bin/sh -- $NCMD

Wenn Sie dies jedoch starten, ohne den Daemon in eine separate Shell zu packen, funktioniert es wie beabsichtigt (nur ohne stderr / stdout-Weiterleitungen):

start-stop-daemon -Sbmv --pidfile $PIDFILE --chdir ${DAEMON_DIR} --exec $DAEMON -- ${DAEMON_ARGS}

Die Frage ist: Warum funktioniert das erste Skript nicht? System ist Debian Lenny, start-stop-daemonVersion ist 1.14.29

Kuroki Kaze
quelle

Antworten:

4

Aufgrund der Reihenfolge der Erweiterung können Sie keine Umleitungen in Variablen übergeben. Die Umleitung wird vor der Wortteilung ausgewertet.

Siehe BashFAQ / 050 , Shell-Erweiterungen und -Umleitungen .

Bis auf weiteres angehalten.
quelle
Ja, also ersetzen Sie einfach die letzten beiden Zeilen durch: NCMD = "exec $ DAEMON $ DAEMON_ARGS"; Start-Stopp-Dämon -Sbmv --pidfile $ PIDFILE --chdir $ {DAEMON_DIR} --exec $ DAEMON --startas / bin / sh - $ NCMD 1 >> $ APPLOG_FILE 2 >> $ ERRLOG_FILE
BMDan
Wird es Knotenströme umleiten oder start-stop-daemon?
Kuroki Kaze
1
@Kuroki und @BMDan: Dadurch wird die Ausgabe von umgeleitet start-stop-daemon.
Bis auf weiteres angehalten.
2
Gibt es eine Möglichkeit, nur auf die Daemon-Ausgabe zu warten (andere von sh wrapper)?
Kuroki Kaze
1

Ihre Zeile im Skript lautet:

start-stop-daemon -Sbmv --pidfile $PIDFILE --chdir ${DAEMON_DIR} --exec $DAEMON --startas /bin/sh -- $NCMD

Also sagen Sie grundsätzlich exec $DAEMONverwenden $NCMDals args. Versuchen Sie , ändern $NCMDzu

"$DAEMON_ARGS 1>>$APPLOG_FILE 2>>$ERRLOG_FILE"

und sehen, ob es funktioniert.

Wenn nicht, müssen Sie Ihre Software ändern, um sie umzuleiten stdoutund stderrin Dateien umzuwandeln (möglicherweise verfügt sie bereits über eine Protokollierungsoption). Sie können auch ein Wrapper- Skript schreiben , um die Umleitung durchzuführen, aber das ist etwas hässlich.

Core-Dump
quelle
1

Ein anderer Weg für diese Streams-Umleitung mit nohup wie:

nohup ./bin/servicemix ./conf/servicemix.xml > log/nohup.log 2>&1 &
zaletniy
quelle