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

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 .


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.


1

Outra maneira de redirecionar fluxos usando nohup como:

nohup ./bin/servicemix ./conf/servicemix.xml > log/nohup.log 2>&1 &
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.