stdout / stderr在start-stop-daemon中重定向


8

我正在尝试编写init配置,它将我的守护程序的输出重定向到两个文件(用于stdout和stderr)。问题是,它不起作用。我正在读这本书

因此,我已经完成了该Shell脚本来测试这种方法。而且它不起作用:

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

但是,如果您在不将守护程序包装在单独的外壳程序中的情况下启动此程序,它将按预期工作(只是没有stderr / stdout重定向):

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

问题是:为什么第一个脚本不起作用?系统是Debian Lenny,start-stop-daemon版本是1.14.29

Answers:


4

由于扩展顺序,您不能在变量中传递重定向。在分词之前先评估重定向。

请参阅BashFAQ / 050Shell扩展重定向


是的,所以只需将最后两行替换为: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 2010年

它会重定向节点流还是start-stop-daemon
黑木风

1
@Kuroki和@BMDan:会将的输出重定向start-stop-daemon
暂停,直到另行通知。

2
有什么办法只监听守护程序输出(sh wrapper的其他输出)?
黑木风

1

脚本中的行是:

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

因此,您基本上是说要$DAEMON使用exec $NCMD作为args。尝试更改$NCMD

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

看看是否可行。

如果没有,您将不得不更改软件以重定向stdout和重定向stderr到文件(也许它已经具有日志记录选项)。您也可以编写包装程序脚本来执行重定向,但这有点丑陋。


1

使用nohup进行流重定向的另一种方式是:

nohup ./bin/servicemix ./conf/servicemix.xml > log/nohup.log 2>&1 &
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.