我正在尝试编写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"
并看看它是否有效。
如果没有,你将不得不改变你的软件redirectstdout
和stderr
文件(也许它已经有一个日志logging选项)。 你也可以编写一个包装器脚本来做redirect,但是这是一个丑陋的一面。
另一种使用nohup进行streamredirect的方法如下:
nohup ./bin/servicemix ./conf/servicemix.xml > log/nohup.log 2>&1 &