Package: dmucs
Version: 0.6.1-2.1
Severity: important

I've been wondering for years why dmucs never worked in my network.
Finally traced the start scripts:

            if start_server && server_running ;  then
...
            if start_loadavg && running ;  then

start_server and start_loadavg don't create a valid PID file for some
indeterminate time after start-stop-daemon fork off a dmucs/loadavg
process.

+ log_daemon_msg 'Starting dmucs distcc coordinator ' dmucs
+ '[' -z 'Starting dmucs distcc coordinator ' ']'
+ log_daemon_msg_pre 'Starting dmucs distcc coordinator ' dmucs
+ log_use_fancy_output
+ TPUT=/usr/bin/tput
+ EXPR=/usr/bin/expr
+ '[' -t 1 ']'
+ '[' xxterm '!=' x ']'
+ '[' xxterm '!=' xdumb ']'
+ '[' -x /usr/bin/tput ']'
+ '[' -x /usr/bin/expr ']'
+ /usr/bin/tput hpa 60
+ /usr/bin/tput setaf 1
+ '[' -z ']'
+ FANCYTTY=1
+ case "$FANCYTTY" in
+ true
+ echo -n '[....] '
[....] + '[' -z dmucs ']'
+ echo -n 'Starting dmucs distcc coordinator : dmucs'
Starting dmucs distcc coordinator : dmucs+ log_daemon_msg_post 'Starting dmucs 
distcc coordinator ' dmucs
+ :
+ server_running
+ '[' '!' -f /var/run/dmucs.pid ']'
+ return 1
+ start_server
+ start-stop-daemon --background --make-pidfile --start --pidfile 
/var/run/dmucs.pid --exec /usr/sbin/dmucs --
+ errcode=0
+ return 0
+ server_running
+ '[' '!' -f /var/run/dmucs.pid ']'
+ return 1
+ log_end_msg 1

Bugger.  Bails out with failure message instead of continuuing on to
start loadavg.

A quick "fix" is to:

            if start_server && sleep 5 && server_running ;  then
...
            if start_loadavg && sleep 5 && running ;  then

but surely there's a better way (eg, remove the test entirely, since
I've never seen any other init script do something like this).


-- System Information:
Debian Release: 7.8
  APT prefers stable
  APT policy: (990, 'stable'), (500, 'stable-updates'), (5, 'testing'), (2, 
'unstable'), (1, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 3.17.0-trunk-amd64 (SMP w/8 CPU cores)
Locale: LANG=en_AU.UTF-8, LC_CTYPE=en_AU.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages dmucs depends on:
ii  libc6       2.19-18
ii  libgcc1     1:4.9.2-10
ii  libstdc++6  4.9.2-10

dmucs recommends no packages.

dmucs suggests no packages.

-- Configuration Files:
/etc/default/dmucs changed:
SERVER=yes
USE_SERVER=dirac
DIETIME=5

/etc/dmucs.conf changed:
dirac   8 10
gamow   2 6
fs      4 3
maxwell 2 2

/etc/init.d/dmucs changed:
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=dmucs
DAEMON=/usr/sbin/loadavg
NAME2=loadavg
DAEMON_WRAPPER=$DAEMON
DESC="dmucs client daemon"
PIDFILE=/var/run/dmucs_loadavg.pid
SERVER_DAEMON=/usr/sbin/dmucs
SERVER_DAEMON_WRAPPER=$SERVER_DAEMON
SERVER_NAME2=dmucs
SERVER_DESC="dmucs distcc coordinator"
SERVER_PIDFILE=/var/run/dmucs.pid
LOGDIR=/var/log/dmucs
test -x $DAEMON || exit 0
test -x $DAEMON_WRAPPER || exit 0
test -x $SERVER_DAEMON || exit 0
test -x $SERVER_DAEMON_WRAPPER || exit 0
. /lib/lsb/init-functions
DODTIME=10              # Time to wait for the server to die, in seconds
                        # If this value is set too low you might not
                        # let some servers to die gracefully and
                        # 'restart' will not work
LOGFILE=$LOGDIR/$NAME.log  # Server logfile
DAEMONUSER=nobody
if [ -f /etc/default/$NAME ] ; then
    . /etc/default/$NAME
fi
if [ -z "$USE_SERVER" -a ! "$SERVER" = "yes" ]; then
     log_warning_msg "please edit /etc/default/$NAME to enable dmucs"
     exit 0
fi
DAEMON_OPTS="-s $USE_SERVER"
SERVER_DAEMON_OPTS=""
set -e
running_pid() {
    pid=$1
    name=$2
    [ -z "$pid" ] && return 1 
    [ ! -d /proc/$pid ] &&  return 1
    cmd=`cat /proc/$pid/cmdline | tr "\000" "\n"|head -n 1 |cut -d : -f 1`
    # Is this the expected server
    [ "$cmd" != "$name" ] &&  return 1
    return 0
}
running() {
    # Check if the process is running looking at /proc
    # (works for all users)
    # No pidfile, probably no daemon present
    [ ! -f "$PIDFILE" ] && return 1
    pid=`cat $PIDFILE`
    running_pid $pid $DAEMON_WRAPPER || return 1
    return 0
}
server_running() {
    # Check if the process is running looking at /proc
    # (works for all users)
    # No pidfile, probably no daemon present
    [ ! -f "$SERVER_PIDFILE" ] && return 1
    pid=`cat $SERVER_PIDFILE`
    running_pid $pid $SERVER_DAEMON_WRAPPER || return 1
    return 0
}
start_server() {
        start-stop-daemon --background --make-pidfile --start --pidfile 
$SERVER_PIDFILE --exec $SERVER_DAEMON -- $SERVER_DAEMON_OPTS
        errcode=$?
        return $errcode
}
start_loadavg() {
        start-stop-daemon --background --make-pidfile --start --pidfile 
$PIDFILE --exec $DAEMON -- $DAEMON_OPTS
        errcode=$?
        return $errcode
}
stop_loadavg() {
        start-stop-daemon --make-pidfile --stop --pidfile $PIDFILE --exec 
$DAEMON
        errcode=$?
        return $errcode
}
stop_server() {
        start-stop-daemon --make-pidfile --stop --pidfile $SERVER_PIDFILE 
--exec $SERVER_DAEMON
        errcode=$?
        return $errcode
}
force_stop() {
        [ ! -e "$PIDFILE" ] && return
        if running ; then
                kill -15 $pid
        # Is it really dead?
                sleep "$DIETIME"s
                if running ; then
                        kill -9 $pid
                        sleep "$DIETIME"s
                        if running ; then
                                echo "Cannot kill $NAME (pid=$pid)!"
                                exit 1
                        fi
                fi
        fi
        rm -f $PIDFILE
}
case "$1" in
  start)
        if [ "$SERVER" = "yes" ]; then
            log_daemon_msg "Starting $SERVER_DESC " "$SERVER_NAME2"
            # Check if it's running first
            if server_running ;  then
                log_progress_msg "apparently already running"
                log_end_msg 0
                exit 0
            fi
            if start_server && sleep 5 && server_running ;  then
                # It's ok, the server started and is running
                log_end_msg 0
            else
                # Either we could not start it or it is not running
                # after we did
                # NOTE: Some servers might die some time after they start,
                # this code does not try to detect this and might give
                # a false positive (use 'status' for that)
                log_end_msg 1
            fi
        fi
        if [ "$USE_SERVER" ]; then
            log_daemon_msg "Starting $DESC " "$NAME2"
            # Check if it's running first
            if running ;  then
                log_progress_msg "apparently already running"
                log_end_msg 0
                exit 0
            fi
            if start_loadavg && sleep 5 && running ;  then
                # It's ok, the server started and is running
                log_end_msg 0
            else
                # Either we could not start it or it is not running
                # after we did
                # NOTE: Some servers might die some time after they start,
                # this code does not try to detect this and might give
                # a false positive (use 'status' for that)
                log_end_msg 1
            fi
        fi
        ;;
  stop)
        if [ "$SERVER" = "yes" ]; then
            log_daemon_msg "Stopping $SERVER_DESC" "$SERVER_NAME2"
            if server_running ; then
                # Only stop the server if we see it running
                stop_server
                log_end_msg $?
            else
                # If it's not running don't do anything
                log_progress_msg "apparently not running"
                log_end_msg 0
                exit 0
            fi
        fi
        if [ "$USE_SERVER" ]; then
            log_daemon_msg "Stopping $DESC" "$NAME2"
            if running ; then
                # Only stop the server if we see it running
                stop_loadavg
                log_end_msg $?
            else
                # If it's not running don't do anything
                log_progress_msg "apparently not running"
                log_end_msg 0
                exit 0
            fi
        fi
        ;;
  force-stop)
        # First try to stop gracefully the program
        $0 stop
        if running; then
            # If it's still running try to kill it more forcefully
            log_daemon_msg "Stopping (force) $DESC" "$NAME2"
            force_stop
            log_end_msg $?
        fi
        ;;
  restart|force-reload)
        if [ "$SERVER" = "yes" ]; then
            log_daemon_msg "Restarting $SERVER_DESC" "$SERVER_NAME2"
            stop_server
            # Wait some sensible amount, some server need this
            [ -n "$DIETIME" ] && sleep $DIETIME
            start_server
            running
            log_end_msg $?
        fi
        if [ "$USE_SERVER" ]; then
            log_daemon_msg "Restarting $DESC" "$NAME2"
            stop_server
            # Wait some sensible amount, some server need this
            [ -n "$DIETIME" ] && sleep $DIETIME
            start_server
            running
            log_end_msg $?
        fi
        ;;
  status)
        log_daemon_msg "Checking status of $DESC" "$NAME2"
        if running ;  then
            log_progress_msg "running"
            log_end_msg 0
        else
            log_progress_msg "apparently not running"
            log_end_msg 1
            exit 1
        fi
        ;;
  # Use this if the daemon cannot reload
  reload)
        log_warning_msg "Reloading $NAME daemon: not implemented, as the daemon"
        log_warning_msg "cannot re-read the config file (use restart)."
        ;;
  *)
        N=/etc/init.d/$NAME
        echo "Usage: $N {start|stop|force-stop|restart|force-reload|status}" >&2
        exit 1
        ;;
esac
exit 0


-- no debconf information

-- debsums errors found:
sh: 1: /usr/sbin/dpkg-divert: not found

Reply via email to