0

I'm testing the logging the output of a simple php script being run via the start-stop daemon on Ubuntu.

The content of the test script, loop.php, is as follows:

<?php

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

When run from the command line, the output is logged as expected to /tmp/loop.log:

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

That works as expected, but now I want to run the script via the start-stop-demon.

I have used an example script as a template to set it up:

#! /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

I can start and stop the daemon and everything works as expected, however nothing gets written to /var/log/myservice.log.

Why is the script output not being logged to the specified log file?

Werner
  • 3,523
  • 1
  • 22
  • 21

1 Answers1

1

Why is the script output not being logged to the specified log file?

When a script is run as a daemon, it will be decoupled from the standard streams (stdin, stdout and stderr). Compare with "How can I log the stdout of a process started by start-stop-daemon?".

You use the standard streams for the logging which are not available in that case.

Instead for a deamon I suggest you directly log to the logfile instead of stderr.

You do not need to change much of your script for that, just remove the redirection when you call your script and at the top of your script set the error_log directive to the error log filename.

hakre
  • 193,403
  • 52
  • 435
  • 836