Stdout / stderr redireciona no start-stop-daemon

8

Estou tentando escrever a initconfiguração que redirecionará a saída do meu daemon para dois arquivos (para stdout e stderr). O problema é que não está funcionando. Estou lendo isso agora.

Então, eu fiz esse script de shell para testar essa abordagem. E isso não funciona:

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

Mas se você iniciar isso sem envolver o daemon em um shell separado, ele funcionará conforme o esperado (apenas sem redirecionamentos stderr / stdout):

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

A questão é: por que o primeiro script não funciona? O sistema é o Debian Lenny, a start-stop-daemonversão é 1.14.29

Kuroki Kaze
fonte

Respostas:

4

Por causa da ordem de expansão, você não pode transmitir redirecionamentos em variáveis. O redirecionamento é avaliado antes da divisão da palavra.

Consulte BashFAQ / 050 , Expansões e redirecionamentos de shell .

Pausado até novo aviso.
fonte
Sim, substitua as duas últimas linhas por: NCMD = "exec $ DAEMON $ DAEMON_ARGS"; start-stop-daemon -Sbmv --pidfile $ PIDFILE --chdir $ {DAEMON_DIR} --exec $ DAEMON --startas / bin / sh - $ NCMD 1 >> $ APPLOG_FILE 2 >> $ ERRLOG_FILE
BMDan
Ele redirecionará fluxos ou nós de nó start-stop-daemon?
Kuroki Kaze
1
@Kuroki e @BMDan: Isso redirecionará a saída de start-stop-daemon.
Pausado até novo aviso.
2
Alguma maneira de ouvir apenas a saída do daemon (outra do sh wrapper)?
22910 Kuroki Kaze
1

Sua linha no script é:

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

Então você está basicamente dizendo ao exec $DAEMONusando $NCMDcomo args. Tente mudar $NCMDpara

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

e veja se funciona.

Caso contrário, você terá que alterar seu software para redirecionar stdoute stderrpara arquivos (talvez ele já tenha uma opção de log). Você também pode escrever um script de wrapper apenas para fazer o redirecionamento, mas isso é um pouco feio.

coredump
fonte
1

Outra maneira de redirecionar fluxos usando nohup como:

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