从start-stop-daemon

时间:2017-06-18 08:46:26

标签: php bash ubuntu logging start-stop-daemon

我正在测试记录通过Ubuntu上的start-stop守护进程运行的简单php脚本的输出。

测试脚本loop.php的内容如下:

<?php

while (true) {
    error_log('Running at '.date('Y-m-d H:i:s').'...');
    sleep(10);
}

从命令行运行时,输出将按预期记录到/tmp/loop.log

php loop.php >> /tmp/loop.log 2>&1

按预期工作,但现在我想通过start-stop-demon运行脚本。

我使用example script作为模板进行设置:

#! /bin/sh

# Installation
# - Move this to /etc/init.d/myservice
# - chmod +x this
#
# Starting and stopping
# - Start: `service myservice start` or `/etc/init.d/myservice start`
# - Stop: `service myservice stop` or `/etc/init.d/myservice stop`

#ref http://till.klampaeckel.de/blog/archives/94-start-stop-daemon,-Gearman-and-a-little-PHP.html
#ref http://unix.stackexchange.com/questions/85033/use-start-stop-daemon-for-a-php-server/85570#85570
#ref http://serverfault.com/questions/229759/launching-a-php-daemon-from-an-lsb-init-script-w-start-stop-daemon

NAME=myservice
DESC="MyService PHP CLI script daemon"
PIDFILE="/var/run/${NAME}.pid"
LOGFILE="/var/log/${NAME}.log"

DAEMON="/usr/bin/php"
DAEMON_OPTS="/home/me/loop.php"

START_OPTS="--start --background --make-pidfile --pidfile ${PIDFILE} --exec ${DAEMON} ${DAEMON_OPTS}"
STOP_OPTS="--stop --pidfile ${PIDFILE}"

test -x $DAEMON || exit 0

set -e

case "$1" in
    start)
        echo -n "Starting ${DESC}: "
        start-stop-daemon $START_OPTS >> $LOGFILE 2>&1
        echo "$NAME."
        ;;
    stop)
        echo -n "Stopping $DESC: "
        start-stop-daemon $STOP_OPTS
        echo "$NAME."
        rm -f $PIDFILE
        ;;
    restart|force-reload)
        echo -n "Restarting $DESC: "
        start-stop-daemon $STOP_OPTS
        sleep 1
        start-stop-daemon $START_OPTS >> $LOGFILE 2>&1
        echo "$NAME."
        ;;
    *)
        N=/etc/init.d/$NAME
        echo "Usage: $N {start|stop|restart|force-reload}" >&2
        exit 1
        ;;
esac

exit 0

我可以启动和停止守护进程,一切都按预期工作,但是没有任何内容写入/var/log/myservice.log

为什么脚本输出没有记录到指定的日志文件?

1 个答案:

答案 0 :(得分:1)

  

为什么脚本输出没有记录到指定的日志文件?

当脚本作为守护程序运行时,它将与标准流(stdin,stdout和stderr)分离。与"How can I log the stdout of a process started by start-stop-daemon?"比较。

您使用标准流进行日志记录,但在这种情况下不可用。

我建议您直接登录日志文件而不是stderr。

您不需要为此更改脚本,只需在调用脚本时删除重定向,并在脚本顶部将error_log directive设置为错误日志文件名。