stdout / stderr在start-stop-daemon中redirect

我正在尝试编写init config,将守护进程的输出redirect到两个文件(stdout和stderr)。 问题是,它不工作。 我正在阅读这个 。

所以,我已经完成了这个shell脚本来testing这个方法。 它不工作:

 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 

但是,如果你在不使用独立的shell包装守护进程的情况下启动它,它将按照预期工作(只要没有stderr / stdoutredirect):

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

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

由于扩展的顺序,你不能在variables中传递redirect。 redirect是在分词之前评估的。

请参阅BashFAQ / 050 , Shell扩展和redirect 。

您的脚本中的行是:

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

所以你基本上说用$NCMD作为参数来执行$DAEMON 。 尝试将$NCMD更改为

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

并看看它是否有效。

如果没有,你将不得不改变你的软件redirectstdoutstderr文件(也许它已经有一个日志logging选项)。 你也可以编写一个包装器脚本来做redirect,但是这是一个丑陋的一面。

另一种使用nohup进行streamredirect的方法如下:

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