Package: munin-node Version: 1.2.4-1 Severity: important "/etc/init.d/munin-node start" never returns and makes the system hang on boot. I can reproduce the effect if I call it from the command line. It hangs in a "read pid" command. I'm not sure if this is a bug of the munin-node init script itself or of some other scripts or programs it calls. If I call the init script with echo 0 | /etc/init.d/munin-node start it does not hang and comes back as usual.
Below is a trace with set -vx. Sorry for the long output, hopefully it helps. Regards, Uwe # /etc/init.d/munin-node start # log_daemon_msg() and log_progress_msg() isn't present in present in Sarge. # Below is a copy of them from lsb-base 3.0-5, for the convenience of back- # porters. If the installed version of lsb-base provides these functions, # they will be used instead. log_daemon_msg () { if [ -z "$1" ]; then return 1 fi if [ -z "$2" ]; then echo -n "$1:" return fi echo -n "$1: $2" } log_progress_msg () { if [ -z "$1" ]; then return 1 fi echo -n " $@" } . /lib/lsb/init-functions + . /lib/lsb/init-functions # /lib/lsb/init-functions for Debian -*- shell-script -*- # #Copyright (c) 2002-05 Chris Lawrence #All rights reserved. # #Redistribution and use in source and binary forms, with or without #modification, are permitted provided that the following conditions #are met: #1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. #2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. #3. Neither the name of the author nor the names of other contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # #THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND #ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE #IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE #ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE #FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL #DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS #OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) #HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT #LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY #OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF #SUCH DAMAGE. start_daemon () { local force nice pidfile exec i set -- `POSIXLY_CORRECT=1 getopt "fn:p:" $*` force=0 nice=0 pidfile=/dev/null for i in $*; do case $i in -f) force=1; shift;; -n) nice=$2; shift 2;; -p) pidfile=$2; shift 2;; --) shift; break;; esac done exec=$1; shift if [ $force = 1 ]; then /sbin/start-stop-daemon --start --nicelevel $nice --quiet --startas $exec --pidfile /dev/null --oknodo -- $* elif [ $pidfile ]; then /sbin/start-stop-daemon --start --nicelevel $nice --quiet --exec $exec --oknodo --pidfile "$pidfile" -- $* else /sbin/start-stop-daemon --start --nicelevel $nice --quiet --exec $exec --oknodo -- $* fi } pidofproc () { local pidfile line i pids= status specified pid set -- `POSIXLY_CORRECT=1 getopt "p:" $*` pidfile= specified= for i in $*; do case $i in -p) pidfile=$2; specified=1; shift 2;; --) shift; break;; esac done if [ -z "${pidfile:-}" ]; then pidfile=/var/run/$(basename "$1").pid fi if [ -f "$pidfile" ]; then read pid if [ -n "${pid:-}" ]; then echo "$pid" return 0 else return 2 # program is dead and /var/run pid file exists fi elif [ -x /bin/pidof -a ! $specified ]; then /bin/pidof -o %PPID $1 status="$?" [ "$status" = 1 ] && return 3 # program is not running return 0 else return 4 # program or service is unknown fi } # start-stop-daemon uses the same algorithm as "pidofproc" above. killproc () { local pidfile sig status base i specified set -- `POSIXLY_CORRECT=1 getopt "p:" $*` pidfile= specified= for i in $*; do case $i in -p) pidfile=$2; specified=1; shift 2;; --) shift; break;; esac done base=$(basename "$1") if [ ! $pidfile ]; then pidfile=/var/run/$base.pid fi if [ $specified ]; then sig=$(echo ${2:-} | sed -e 's/^-\(.*\)/\1/') sig=$(echo $sig | sed -e 's/^SIG\(.*\)/\1/') sig=${sig:-TERM} /sbin/start-stop-daemon --stop --pidfile "$pidfile" --signal $sig --quiet --name "$base" status="$?" [ "$status" = 1 ] && return 3 # program is not running return 0 else /sbin/start-stop-daemon --stop --pidfile "$pidfile" --retry 5 --quiet --oknodo --name "$base" fi rm -f "$pidfile" } log_use_fancy_output () { TPUT=/usr/bin/tput EXPR=/usr/bin/expr if [ "x$TERM" != "xdumb" ] && [ -x $TPUT ] && [ -x $EXPR ] && $TPUT hpa 60 >/dev/null 2>&1; then FANCYTTY=1 true else FANCYTTY=0 false fi } log_success_msg () { echo "$@" } log_failure_msg () { if log_use_fancy_output; then RED=`$TPUT setaf 1` NORMAL=`$TPUT op` echo "$RED*$NORMAL $@" else echo "$@" fi } log_warning_msg () { if log_use_fancy_output; then YELLOW=`$TPUT setaf 3` NORMAL=`$TPUT op` echo "$YELLOW*$NORMAL $@" else echo "$@" fi } # # NON-LSB HELPER FUNCTIONS # # int get_lsb_header_val (char *scriptpathname, char *key) get_lsb_header_val () { if [ ! -f "$1" ] || [ -z "${2:-}" ]; then return 1 fi LSB_S="### BEGIN INIT INFO" LSB_E="### END INIT INFO" sed -n "/$LSB_S/,/$LSB_E/ s/# $2: \(.*\)/\1/p" $1 } # int log_begin_message (char *message) log_begin_msg () { if [ -z "${1:-}" ]; then return 1 fi echo -n "$@" } # Sample usage: # log_daemon_msg "Starting GNOME Login Manager" "gdm" # # On Debian, would output "Starting GNOME Login Manager: gdm" # On Ubuntu, would output " * Starting GNOME Login Manager..." # # If the second argument is omitted, logging suitable for use with # log_progress_msg() is used: # # log_daemon_msg "Starting remote filesystem services" # # On Debian, would output "Starting remote filesystem services:" # On Ubuntu, would output " * Starting remote filesystem services..." log_daemon_msg () { if [ -z "${1:-}" ]; then return 1 fi if [ -z "${2:-}" ]; then echo -n "$1:" return fi echo -n "$1: $2" } # #319739 # # Per policy docs: # # log_daemon_msg "Starting remote file system services" # log_progress_msg "nfsd"; start-stop-daemon --start --quiet nfsd # log_progress_msg "mountd"; start-stop-daemon --start --quiet mountd # log_progress_msg "ugidd"; start-stop-daemon --start --quiet ugidd # log_end_msg 0 # # You could also do something fancy with log_end_msg here based on the # return values of start-stop-daemon; this is left as an exercise for # the reader... # # On Ubuntu, one would expect log_progress_msg to be a no-op. log_progress_msg () { if [ -z "${1:-}" ]; then return 1 fi echo -n " $@" } # int log_end_message (int exitstatus) log_end_msg () { # If no arguments were passed, return [ -z "${1:-}" ] && return 1 # Only do the fancy stuff if we have an appropriate terminal # and if /usr is already mounted if log_use_fancy_output; then RED=`$TPUT setaf 1` NORMAL=`$TPUT op` if [ $1 -eq 0 ]; then echo "." else /bin/echo -e " ${RED}failed!${NORMAL}" fi else if [ $1 -eq 0 ]; then echo "." else echo " failed!" fi fi return $1 } log_action_msg () { echo "[EMAIL PROTECTED]" } log_action_begin_msg () { echo -n "[EMAIL PROTECTED]" } log_action_cont_msg () { echo -n "[EMAIL PROTECTED]" } log_action_end_msg () { if [ -z "${2:-}" ]; then end="." else end=" ($2)." fi if [ $1 -eq 0 ]; then echo "done${end}" else if log_use_fancy_output; then RED=`$TPUT setaf 1` NORMAL=`$TPUT op` /bin/echo -e "${RED}failed${end}${NORMAL}" else echo "failed${end}" fi fi } [ -e /etc/lsb-base-logging.sh ] && . /etc/lsb-base-logging.sh || true ++ '[' -e /etc/lsb-base-logging.sh ']' ++ true if [ ! -x $DAEMON ]; then log_failure_msg "Munin-Node appears to be uninstalled." exit 5 elif [ ! -e $CONFFILE ]; then log_failure_msg "Munin-Node appears to be unconfigured." exit 6 fi + '[' '!' -x /usr/sbin/munin-node ']' + '[' '!' -e /etc/munin/munin-node.conf ']' # Figure out if the pid file is in a non-standard location while read line; do line=${line%%\#*} # get rid of comments set -f line=$(echo $line) # get rid of extraneous blanks set +f if [ "$line" != "${line#pid_file }" ]; then PIDFILE=${line#pid_file } fi done < $CONFFILE + read line + line= + set -f echo $line ++ echo + line= + set +f + '[' '' '!=' '' ']' + read line + line= + set -f echo $line ++ echo + line= + set +f + '[' '' '!=' '' ']' + read line + line= + set -f echo $line ++ echo + line= + set +f + '[' '' '!=' '' ']' + read line + line= + set -f echo $line ++ echo + line= + set +f + '[' '' '!=' '' ']' + read line + line='log_level 4' + set -f echo $line ++ echo log_level 4 + line='log_level 4' + set +f + '[' 'log_level 4' '!=' 'log_level 4' ']' + read line + line='log_file /var/log/munin/munin-node.log' + set -f echo $line ++ echo log_file /var/log/munin/munin-node.log + line='log_file /var/log/munin/munin-node.log' + set +f + '[' 'log_file /var/log/munin/munin-node.log' '!=' 'log_file /var/log/munin/munin-node.log' ']' + read line + line='port 4949' + set -f echo $line ++ echo port 4949 + line='port 4949' + set +f + '[' 'port 4949' '!=' 'port 4949' ']' + read line + line='pid_file /var/run/munin/munin-node.pid' + set -f echo $line ++ echo pid_file /var/run/munin/munin-node.pid + line='pid_file /var/run/munin/munin-node.pid' + set +f + '[' 'pid_file /var/run/munin/munin-node.pid' '!=' /var/run/munin/munin-node.pid ']' + PIDFILE=/var/run/munin/munin-node.pid + read line + line='background 1' + set -f echo $line ++ echo background 1 + line='background 1' + set +f + '[' 'background 1' '!=' 'background 1' ']' + read line + line='setseid 1' + set -f echo $line ++ echo setseid 1 + line='setseid 1' + set +f + '[' 'setseid 1' '!=' 'setseid 1' ']' + read line + line= + set -f echo $line ++ echo + line= + set +f + '[' '' '!=' '' ']' + read line + line= + set -f echo $line ++ echo + line= + set +f + '[' '' '!=' '' ']' + read line + line='host *' + set -f echo $line ++ echo host '*' + line='host *' + set +f + '[' 'host *' '!=' 'host *' ']' + read line + line='user root' + set -f echo $line ++ echo user root + line='user root' + set +f + '[' 'user root' '!=' 'user root' ']' + read line + line='group root' + set -f echo $line ++ echo group root + line='group root' + set +f + '[' 'group root' '!=' 'group root' ']' + read line + line='setsid yes' + set -f echo $line ++ echo setsid yes + line='setsid yes' + set +f + '[' 'setsid yes' '!=' 'setsid yes' ']' + read line + line= + set -f echo $line ++ echo + line= + set +f + '[' '' '!=' '' ']' + read line + line= + set -f echo $line ++ echo + line= + set +f + '[' '' '!=' '' ']' + read line + line= + set -f echo $line ++ echo + line= + set +f + '[' '' '!=' '' ']' + read line + line='ignore_file ~$' + set -f echo $line ++ echo ignore_file '~$' + line='ignore_file ~$' + set +f + '[' 'ignore_file ~$' '!=' 'ignore_file ~$' ']' + read line + line='ignore_file .bak$' + set -f echo $line ++ echo ignore_file '.bak$' + line='ignore_file .bak$' + set +f + '[' 'ignore_file .bak$' '!=' 'ignore_file .bak$' ']' + read line + line='ignore_file %$' + set -f echo $line ++ echo ignore_file '%$' + line='ignore_file %$' + set +f + '[' 'ignore_file %$' '!=' 'ignore_file %$' ']' + read line + line='ignore_file .dpkg-(tmp|new|old|dist)$' + set -f echo $line ++ echo ignore_file '.dpkg-(tmp|new|old|dist)$' + line='ignore_file .dpkg-(tmp|new|old|dist)$' + set +f + '[' 'ignore_file .dpkg-(tmp|new|old|dist)$' '!=' 'ignore_file .dpkg-(tmp|new|old|dist)$' ']' + read line + line='ignore_file .rpm(save|new)$' + set -f echo $line ++ echo ignore_file '.rpm(save|new)$' + line='ignore_file .rpm(save|new)$' + set +f + '[' 'ignore_file .rpm(save|new)$' '!=' 'ignore_file .rpm(save|new)$' ']' + read line + line= + set -f echo $line ++ echo + line= + set +f + '[' '' '!=' '' ']' + read line + line= + set -f echo $line ++ echo + line= + set +f + '[' '' '!=' '' ']' + read line + line= + set -f echo $line ++ echo + line= + set +f + '[' '' '!=' '' ']' + read line + line= + set -f echo $line ++ echo + line= + set +f + '[' '' '!=' '' ']' + read line + line= + set -f echo $line ++ echo + line= + set +f + '[' '' '!=' '' ']' + read line + line= + set -f echo $line ++ echo + line= + set +f + '[' '' '!=' '' ']' + read line + line= + set -f echo $line ++ echo + line= + set +f + '[' '' '!=' '' ']' + read line + line= + set -f echo $line ++ echo + line= + set +f + '[' '' '!=' '' ']' + read line + line= + set -f echo $line ++ echo + line= + set +f + '[' '' '!=' '' ']' + read line + line= + set -f echo $line ++ echo + line= + set +f + '[' '' '!=' '' ']' + read line + line= + set -f echo $line ++ echo + line= + set +f + '[' '' '!=' '' ']' + read line + line='allow ^127.0.0.1$' + set -f echo $line ++ echo allow '^127.0.0.1$' + line='allow ^127.0.0.1$' + set +f + '[' 'allow ^127.0.0.1$' '!=' 'allow ^127.0.0.1$' ']' + read line verify_superuser() { action=$1 # dash/ash do not provide $EUID, set it explicitly if not # I can't find any way of avoiding a fork in these # shells - drop me an email if you've got any suggestions [ -z "$EUID" ] && EUID=$(id -u) [ $EUID -eq 0 ] && return log_failure_msg "Superuser privileges required for the" \ "\"$action\" action." exit 4 } start() { log_daemon_msg "Starting Munin-Node" if pidofproc -p $PIDFILE $DAEMON >/dev/null; then log_progress_msg "started beforehand" log_end_msg 0 exit 0 fi start_daemon -p $PIDFILE $DAEMON ret=$? # start_daemon() isn't thorough enough, ensure the daemon has been # started manually attempts=0 until pidofproc -p $PIDFILE $DAEMON >/dev/null; do attempts=$(( $attempts + 1 )) sleep 0.05 [ $attempts -lt 20 ] && continue log_end_msg 1 return 1 done [ $ret -eq 0 ] && log_progress_msg "done" log_end_msg $ret return $ret } stop() { log_daemon_msg "Stopping Munin-Node" # killproc() doesn't try hard enough if the pid file is missing, # so create it is gone and the daemon is still running if [ ! -r $PIDFILE ]; then pid=$(pidofproc -p $PIDFILE $DAEMON) if [ -z "$pid" ]; then log_progress_msg "stopped beforehand" log_end_msg 0 return 0 fi echo $pid 2>/dev/null > $PIDFILE if [ $? -ne 0 ]; then log_end_msg 1 return 1 fi fi killproc -p $PIDFILE /usr/bin/munin-node ret=$? # killproc() isn't thorough enough, ensure the daemon has been # stopped manually attempts=0 until ! pidofproc -p $PIDFILE $DAEMON >/dev/null; do attempts=$(( $attempts + 1 )) sleep 0.05 [ $attempts -lt 20 ] && continue log_end_msg 1 return 1 done [ $ret -eq 0 ] && log_progress_msg "done" log_end_msg $ret return $ret } if [ "$#" -ne 1 ]; then log_failure_msg "Usage: /etc/init.d/munin-node" \ "{start|stop|restart|force-reload|try-restart}" exit 2 fi + '[' 1 -ne 1 ']' case "$1" in start) verify_superuser $1 start exit $? ;; stop) verify_superuser $1 stop exit $? ;; restart|force-reload) verify_superuser $1 stop || exit $? start exit $? ;; try-restart) verify_superuser $1 pidofproc -p $PIDFILE $DAEMON >/dev/null if [ $? -eq 0 ]; then stop || exit $? start exit $? fi log_success_msg "Munin-Node was stopped beforehand and thus not" \ "restarted." exit 0 ;; reload) log_failure_msg "The \"reload\" action is not implemented." exit 3 ;; status) pid=$(pidofproc -p $PIDFILE $DAEMON) ret=$? pid=${pid% } # pidofproc() supplies a trailing space, strip it if [ $ret -eq 0 ]; then log_success_msg "Munin-Node is running (PID: $pid)" exit 0 # the LSB specifies that I in this case (daemon dead + pid file exist) # should return 1, so why init-functions use 2 I don't know. whatever. elif [ $ret -eq 2 ]; then log_failure_msg "Munin-Node is dead, although $PIDFILE exists." exit 1 elif [ $ret -eq 3 ]; then log_warning_msg "Munin-Node is not running." exit 3 fi log_warning_msg "Munin-Node status unknown." exit 4 ;; *) log_failure_msg "Usage: /etc/init.d/munin-node" \ "{start|stop|restart|force-reload|try-restart}" exit 2 ;; esac + case "$1" in + verify_superuser start + action=start + '[' -z 0 ']' + '[' 0 -eq 0 ']' + return + start + log_daemon_msg 'Starting Munin-Node' + '[' -z 'Starting Munin-Node' ']' + '[' -z '' ']' + echo -n 'Starting Munin-Node:' Starting Munin-Node:+ return + pidofproc -p /var/run/munin/munin-node.pid /usr/sbin/munin-node + local pidfile line i pids= status specified pid POSIXLY_CORRECT=1 getopt "p:" $* ++ POSIXLY_CORRECT=1 ++ getopt p: -p /var/run/munin/munin-node.pid /usr/sbin/munin-node + set -- -p /var/run/munin/munin-node.pid -- /usr/sbin/munin-node + pidfile= + specified= + for i in '$*' + case $i in + pidfile=/var/run/munin/munin-node.pid + specified=1 + shift 2 + for i in '$*' + case $i in + for i in '$*' + case $i in + shift + break + '[' -z /var/run/munin/munin-node.pid ']' + '[' -f /var/run/munin/munin-node.pid ']' + '[' -x /bin/pidof -a '!' 1 ']' + return 4 + start_daemon -p /var/run/munin/munin-node.pid /usr/sbin/munin-node + local force nice pidfile exec i POSIXLY_CORRECT=1 getopt "fn:p:" $* ++ POSIXLY_CORRECT=1 ++ getopt fn:p: -p /var/run/munin/munin-node.pid /usr/sbin/munin-node + set -- -p /var/run/munin/munin-node.pid -- /usr/sbin/munin-node + force=0 + nice=0 + pidfile=/dev/null + for i in '$*' + case $i in + pidfile=/var/run/munin/munin-node.pid + shift 2 + for i in '$*' + case $i in + for i in '$*' + case $i in + shift + break + exec=/usr/sbin/munin-node + shift + '[' 0 = 1 ']' + '[' /var/run/munin/munin-node.pid ']' + /sbin/start-stop-daemon --start --nicelevel 0 --quiet --exec /usr/sbin/munin-node --oknodo --pidfile /var/run/munin/munin-node.pid -- + ret=0 + attempts=0 + pidofproc -p /var/run/munin/munin-node.pid /usr/sbin/munin-node + local pidfile line i pids= status specified pid POSIXLY_CORRECT=1 getopt "p:" $* ++ POSIXLY_CORRECT=1 ++ getopt p: -p /var/run/munin/munin-node.pid /usr/sbin/munin-node + set -- -p /var/run/munin/munin-node.pid -- /usr/sbin/munin-node + pidfile= + specified= + for i in '$*' + case $i in + pidfile=/var/run/munin/munin-node.pid + specified=1 + shift 2 + for i in '$*' + case $i in + for i in '$*' + case $i in + shift + break + '[' -z /var/run/munin/munin-node.pid ']' + '[' -f /var/run/munin/munin-node.pid ']' + read pid -- System Information: Debian Release: testing/unstable APT prefers testing APT policy: (750, 'testing'), (650, 'unstable'), (1, 'experimental') Architecture: i386 (i686) Shell: /bin/sh linked to /bin/bash Kernel: Linux 2.6.15-1-k7 Locale: LANG=en_US, LC_CTYPE=en_US (charmap=ISO-8859-1) Versions of packages munin-node depends on: ii adduser 3.87 Add and remove users and groups ii libnet-server-perl 0.90-1 An extensible, general perl server ii lsb-base 3.1-8 Linux Standard Base 3.1 init scrip ii perl 5.8.8-4 Larry Wall's Practical Extraction ii procps 1:3.2.6-2.2 /proc file system utilities Versions of packages munin-node recommends: ii libnet-snmp-perl 5.2.0-1 Script SNMP connections -- no debconf information -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]