MailScanner refuses to shutdown - Possible broken pidof

George C zepplin at exemail.com.au
Sat Sep 6 15:25:17 IST 2008


Hi,

I have MailScanner - v4.71.10 installed
Exim 4.69

Installation was done by configserver (Way to the Web Limited)
approximately 8 months or so ago.

WHM 11.23.2 cPanel 11.23.6-R27164
<https://117.55.225.105:2087/scripts2/upcpform>
CENTOS Enterprise 4.6 i686 on standard - WHM X v3.1.0

Up until recently MailScanner has performed flawlessly.

Over the last week or so I've been getting daily mail showing
MailScanner fails to shutdown.

Aug 27 10:33:21 JS-GC-S1 MailScanner: MailScanner shutdown failed
Aug 27 10:33:22 JS-GC-S1 runuser: Starting MailScanner...
Aug 27 10:33:23 JS-GC-S1 MailScanner: MailScanner setting GID to mail (12) 
Aug 27 10:33:23 JS-GC-S1 MailScanner: MailScanner setting UID to mailnull (47)

Also tried to manually shutdown with same result.

[root at JS-GC-S1 ~]# /etc/rc.d/init.d/MailScanner restart
Shutting down MailScanner daemons:
         MailScanner:                                      [FAILED]
         Waiting for MailScanner to stop...
Starting MailScanner daemons:
         MailScanner:                                      [  OK  ]


I have contacted configserver and they say pidof is more than likely broken but cant offer any further assistance.


I would appreciate any help/advice or suggestions as to how I may fix this recent issue.

**********************************************

copy of /etc/rc.d/init.d/MailScanner

. /etc/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

TMPDIR=/var/spool/MailScanner
export TMPDIR

wait_for_pid () {
  i=0
  echo -n "."
  while test $i -lt 35 ; do
    echo -n "."
    if [ -z "`/usr/bin/pgrep -u mailnull -f MailScanner`" ]; then
      break
    fi
    kill -9 `/usr/bin/pgrep -u mailnull -f MailScanner` >/dev/null 2>&1
    sleep 1
    i=`expr $i + 1`
  done
}

# See how we were called.
case "$1" in
  start)
        # Start daemons.
        echo 'Starting MailScanner daemons:'
        echo -n '         MailScanner:       '
        daemon --user=root /usr/mailscanner/bin/check_mailscanner >/dev/null
        success
        echo
        ;;
  stop)
        # Stop daemons.
        echo    'Shutting down MailScanner daemons:'
        echo -n '         MailScanner:'
        killproc MailScanner
        echo
        echo -n '         Waiting for MailScanner to stop'
        wait_for_pid
        echo
        ;;
  status)
        # Work out if all of MailScanner is running
        echo    'Checking MailScanner daemons:'
        status MailScanner
        echo
        ;;
  reload)
        echo    'Reloading MailScanner workers:'
        killproc MailScanner -HUP
        if [ -z "`/usr/bin/pgrep -u mailnull -f MailScanner`" ]; then
                $0 start
fi
        echo
        ;;
  restart)
        $0 stop
        $0 start
        ;;
  *)
        echo "Usage: service MailScanner {start|stop|status|restart|reload}"
        exit 1
esac

exit

**********************************************
 
copy of /etc/init.d/functions

# -*-Shell-script-*-
#
# functions     This file contains functions to be used by most or all
#               shell scripts in the /etc/init.d directory.
#

TEXTDOMAIN=initscripts

# Make sure umask is sane
umask 022

# Set up a default search path.
PATH="/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin"
export PATH

# Get a sane screen width
[ -z "${COLUMNS:-}" ] && COLUMNS=80

[ -z "${CONSOLETYPE:-}" ] && CONSOLETYPE="`/sbin/consoletype`"

if [ -f /etc/sysconfig/i18n -a -z "${NOLOCALE:-}" ] ; then
  . /etc/sysconfig/i18n
  if [ "$CONSOLETYPE" != "pty" ]; then
        case "${LANG:-}" in
                ja_JP*|ko_KR*|zh_CN*|zh_TW*|bn_*|bd_*|pa_*|hi_*|ta_*|gu_*)
                        export LC_MESSAGES=en_US
                        export LANG
                        ;;
                *)
                        export LANG
                        ;;
        esac
  else
        [ -n "$LC_MESSAGES" ] && export LC_MESSAGES
        export LANG
  fi
fi

# Read in our configuration
if [ -z "${BOOTUP:-}" ]; then
  if [ -f /etc/sysconfig/init ]; then
      . /etc/sysconfig/init
  else
    # This all seem confusing? Look in /etc/sysconfig/init,
    # or in /usr/doc/initscripts-*/sysconfig.txt
    BOOTUP=color
    RES_COL=60
    MOVE_TO_COL="echo -en \\033[${RES_COL}G"
    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    SETCOLOR_FAILURE="echo -en \\033[1;31m"
    SETCOLOR_WARNING="echo -en \\033[1;33m"
    SETCOLOR_NORMAL="echo -en \\033[0;39m"
    LOGLEVEL=1
  fi
  if [ "$CONSOLETYPE" = "serial" ]; then
      BOOTUP=serial
      MOVE_TO_COL=
      SETCOLOR_SUCCESS=
      SETCOLOR_FAILURE=
      SETCOLOR_WARNING=
      SETCOLOR_NORMAL=
  fi
fi

if [ "${BOOTUP:-}" != "verbose" ]; then
   INITLOG_ARGS="-q"
else
   INITLOG_ARGS=
fi

# Check if $pid (could be plural) are running
checkpid() {
        local i

        for i in $* ; do
                [ -d "/proc/$i" ] && return 0
        done
        return 1
}


# A function to start a program.
daemon() {
        # Test syntax.
        local gotbase= force=
        local base= user= nice= bg= pid=
        nicelevel=0
        while [ "$1" != "${1##[-+]}" ]; do
          case $1 in
            '')    echo $"$0: Usage: daemon [+/-nicelevel] {program}"
                   return 1;;
            --check)
                   base=$2
                   gotbase="yes"
                   shift 2
                   ;;
            --check=?*)
                   base=${1#--check=}
                   gotbase="yes"
                   shift
                   ;;
            --user)
                   user=$2
                   shift 2
                   ;;
            --user=?*)
                   user=${1#--user=}
                   shift
                   ;;
            --force)
                   force="force"
                   shift
                   ;;
            [-+][0-9]*)
                   nice="nice -n $1"
                   shift
                   ;;
            *)     echo $"$0: Usage: daemon [+/-nicelevel] {program}"
                   return 1;;
          esac
        done

        # Save basename.
        [ -z "$gotbase" ] && base=${1##*/}

        # See if it's already running. Look *only* at the pid file.
        if [ -f /var/run/${base}.pid ]; then
                local line p
                read line < /var/run/${base}.pid
                for p in $line ; do
                        [ -z "${p//[0-9]/}" -a -d "/proc/$p" ] && pid="$pid $p"
                done
   fi

        [ -n "${pid:-}" -a -z "${force:-}" ] && return

        # make sure it doesn't core dump anywhere unless requested
        ulimit -S -c ${DAEMON_COREFILE_LIMIT:-0} >/dev/null 2>&1

        # if they set NICELEVEL in /etc/sysconfig/foo, honor it
        [ -n "$NICELEVEL" ] && nice="nice -n $NICELEVEL"

        # Echo daemon
        [ "${BOOTUP:-}" = "verbose" -a -z "$LSB" ] && echo -n " $base"

        # And start it up.
        if [ -z "$user" ]; then
           $nice initlog $INITLOG_ARGS -c "$*"
        else
           $nice initlog $INITLOG_ARGS -c "runuser -s /bin/bash - $user -c \"$*\""
        fi
        [ "$?" -eq 0 ] && success $"$base startup" || failure $"$base startup"
}

# A function to stop a program.
killproc() {
        RC=0; delay=3
        # Test syntax.
        if [ "$#" -eq 0 ]; then
                echo $"Usage: killproc [ -d delay] {program} [signal]"
                return 1
        fi
        if [ "$1" = "-d" ]; then
                delay=$2
                shift 2
        fi

        notset=0
notset=0
        # check for second arg to be kill level
        if [ -n "$2" ]; then
                killlevel=$2
        else
                notset=1
                killlevel="-9"
        fi

        # Save basename.
        base=${1##*/}

        # Find pid.
        pid=
        if [ -f /var/run/${base}.pid ]; then
                local line p
                read line < /var/run/${base}.pid
                for p in $line ; do
                        [ -z "${p//[0-9]/}" -a -d "/proc/$p" ] && pid="$pid $p"
                done
        fi
        if [ -z "$pid" ]; then
                pid=`pidof -o $$ -o $PPID -o %PPID -x $1 || \
                        pidof -o $$ -o $PPID -o %PPID -x $base`
        fi

        # Kill it.
        if [ -n "${pid:-}" ] ; then
                [ "$BOOTUP" = "verbose" -a -z "$LSB" ] && echo -n "$base "
                if [ "$notset" -eq "1" ] ; then
                       if checkpid $pid 2>&1; then
                           # TERM first, then KILL if not dead
                           kill -TERM $pid >/dev/null 2>&1
                           usleep 100000
                           if checkpid $pid && sleep 1 &&
                              checkpid $pid && sleep $delay &&
                              checkpid $pid ; then
                                kill -KILL $pid >/dev/null 2>&1
                                usleep 100000
                           fi
                        fi
                        checkpid $pid
                        RC=$?
                        [ "$RC" -eq 0 ] && failure $"$base shutdown" || success $"$base shutdown"
                        RC=$((! $RC))
                # use specified level only
                else
                        if checkpid $pid; then
                                kill $killlevel $pid >/dev/null 2>&1
                                RC=$?
                                [ "$RC" -eq 0 ] && success $"$base $killlevel" || failure $"$base $killlevel"
                        fi
                fi
        else
            failure $"$base shutdown"
            RC=1
        fi

        # Remove pid file if any.
        if [ "$notset" = "1" ]; then
            rm -f /var/run/$base.pid
        fi
        return $RC
}

# A function to find the pid of a program. Looks *only* at the pidfile
pidfileofproc() {
        local base=${1##*/}

        # Test syntax.
        if [ "$#" = 0 ] ; then
                echo $"Usage: pidfileofproc {program}"
                return 1
        fi

        # First try "/var/run/*.pid" files
        if [ -f /var/run/$base.pid ] ; then
                local line p pid=
                read line < /var/run/$base.pid
                for p in $line ; do
                       [ -z "${p//[0-9]/}" -a -d /proc/$p ] && pid="$pid $p"
                done
                if [ -n "$pid" ]; then
                        echo $pid
                        return 0
                fi
        fi
}

# A function to find the pid of a program.
pidofproc() {
        base=${1##*/}

        # Test syntax.
        if [ "$#" = 0 ]; then
                echo $"Usage: pidofproc {program}"
                return 1
        fi

        # First try "/var/run/*.pid" files
        if [ -f /var/run/$base.pid ]; then
                local line p pid=
                read line < /var/run/$base.pid
                for p in $line ; do
                       [ -z "${p//[0-9]/}" -a -d /proc/$p ] && pid="$pid $p"
                done
                if [ -n "$pid" ]; then
                        echo $pid
                        return 0
                fi
        fi
        pidof -o $$ -o $PPID -o %PPID -x $1 || \
                pidof -o $$ -o $PPID -o %PPID -x $base
}

status() {
        local base=${1##*/}
        local pid

        # Test syntax.
        if [ "$#" = 0 ] ; then
                echo $"Usage: status {program}"
                return 1
        fi

        # First try "pidof"
        pid=`pidof -o $$ -o $PPID -o %PPID -x $1 || \
             pidof -o $$ -o $PPID -o %PPID -x ${base}`
        if [ -n "$pid" ]; then
                echo $"${base} (pid $pid) is running..."
                return 0
        fi

        # Next try "/var/run/*.pid" files
        if [ -f /var/run/${base}.pid ] ; then
                read pid < /var/run/${base}.pid
                if [ -n "$pid" ]; then
                        echo $"${base} dead but pid file exists"
                        return 1
                fi
        fi
        # See if /var/lock/subsys/${base} exists
        if [ -f /var/lock/subsys/${base} ]; then
                echo $"${base} dead but subsys locked"
                return 2
        fi
        echo $"${base} is stopped"
        return 3
}

echo_success() {
  [ "$BOOTUP" = "color" ] && $MOVE_TO_COL
  echo -n "[  "
  [ "$BOOTUP" = "color" ] && $SETCOLOR_SUCCESS
  echo -n $"OK"
  [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
  echo -n "  ]"
  echo -ne "\r"
  return 0
}

echo_failure() {
  [ "$BOOTUP" = "color" ] && $MOVE_TO_COL
  echo -n "["
  [ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE
  echo -n $"FAILED"
  [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
  echo -n "]"
  echo -ne "\r"
  return 1
}

echo_passed() {
  [ "$BOOTUP" = "color" ] && $MOVE_TO_COL
  echo -n "["
  [ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING
  echo -n $"PASSED"
  [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
  echo -n "]"
  echo -ne "\r"
  return 1
}

echo_warning() {
  [ "$BOOTUP" = "color" ] && $MOVE_TO_COL
  echo -n "["
  [ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING
  echo -n $"WARNING"
  [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
  echo -n "]"
  echo -ne "\r"
  return 1
}

# Inform the graphical boot of our current state
update_boot_stage() {
  if [ "$GRAPHICAL" = "yes" -a -x /usr/bin/rhgb-client ]; then
    /usr/bin/rhgb-client --update="$1"
  fi
  return 0
}

# Log that something succeeded
success() {
  if [ -z "${IN_INITLOG:-}" ]; then
     initlog $INITLOG_ARGS -n $0 -s "$1" -e 1
  else
     # silly hack to avoid EPIPE killing rc.sysinit
     trap "" SIGPIPE
     echo "$INITLOG_ARGS -n $0 -s \"$1\" -e 1" >&21
     trap - SIGPIPE
  fi
  [ "$BOOTUP" != "verbose" -a -z "$LSB" ] && echo_success
  return 0
}

# Log that something failed
failure() {
  rc=$?
  if [ -z "${IN_INITLOG:-}" ]; then
     initlog $INITLOG_ARGS -n $0 -s "$1" -e 2
  else
     trap "" SIGPIPE
     echo "$INITLOG_ARGS -n $0 -s \"$1\" -e 2" >&21
     trap - SIGPIPE
  fi
  [ "$BOOTUP" != "verbose" -a -z "$LSB" ] && echo_failure
  [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --details=yes
  return $rc
}

# Log that something passed, but may have had errors. Useful for fsck
passed() {
  rc=$?
  if [ -z "${IN_INITLOG:-}" ]; then
     initlog $INITLOG_ARGS -n $0 -s "$1" -e 1
  else
     trap "" SIGPIPE
     echo "$INITLOG_ARGS -n $0 -s \"$1\" -e 1" >&21
     trap - SIGPIPE
  fi
  [ "$BOOTUP" != "verbose" -a -z "$LSB" ] && echo_passed
  return $rc
}

# Log a warning
warning() {
  rc=$?
  if [ -z "${IN_INITLOG:-}" ]; then
     initlog $INITLOG_ARGS -n $0 -s "$1" -e 1
  else
     trap "" SIGPIPE
     echo "$INITLOG_ARGS -n $0 -s \"$1\" -e 1" >&21
     trap - SIGPIPE
  fi
  [ "$BOOTUP" != "verbose" -a -z "$LSB" ] && echo_warning
  return $rc
}

# Run some action. Log its output.
action() {
  STRING=$1
  echo -n "$STRING "
  if [ "${RHGB_STARTED}" != "" -a -w /etc/rhgb/temp/rhgb-console ]; then
      echo -n "$STRING " > /etc/rhgb/temp/rhgb-console
  fi
  shift
  initlog $INITLOG_ARGS -c "$*" && success $"$STRING" || failure $"$STRING"
  rc=$?
  echo
  if [ "${RHGB_STARTED}" != "" -a -w /etc/rhgb/temp/rhgb-console ]; then
      if [ "$rc" = "0" ]; then
        echo_success > /etc/rhgb/temp/rhgb-console
      else
        echo_failure > /etc/rhgb/temp/rhgb-console
        [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --details=yes
      fi
      echo
  fi
  return $rc
}

# returns OK if $1 contains $2
strstr() {
  [ "${1#*$2*}" = "$1" ] && return 1
  return 0
}

# Confirm whether we really want to run this service
confirm() {
  [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --details=yes
  while : ; do
      echo -n $"Start service $1 (Y)es/(N)o/(C)ontinue? [Y] "
      read answer
      if strstr $"yY" "$answer" || [ "$answer" = "" ] ; then
         return 0
      elif strstr $"cC" "$answer" ; then
         rm -f /var/run/confirm
         [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --details=no
         return 2
      elif strstr $"nN" "$answer" ; then
         return 1
      fi
  done
}




Regards,

- George Chown


-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.mailscanner.info/pipermail/mailscanner/attachments/20080907/3c249486/attachment.html


More information about the MailScanner mailing list