Hi David,

Each slave is single-threaded, so that shouldn't happen.  I honestly
don't know what it could be.

Is there a way under FreeBSD to see a process's open file descriptors?
(In Linux, it's under /proc/PID/fd)  Maybe that would give us a clue?

There is lsof - and I was only able to see some fd's open on /dev/null and the usual stuff.

1 of 100 mimedefang reloads kills the multiplexer here, could this be
related to the open FD's ?

Also a nice error we see is that the bayes yournal of spamassassin does
sometimes belong to 'root' ! instead of the mimedefang user after a reload
which makes bayes updates failing then.

We use now a bit modified startup skript to check and prevent this. And
we also check the validity of mimedefang-filter and spamassassin conf
at the beginning to prevent shooting yourself in your feet :-)

Feel free to add parts of this to the default mimedefang skript.

Martin

#!/bin/sh
#
# Generic start/stop script for MIMEDefang.  Should work on most
# flavors of UNIX.

cd /tmp
PREFIX=%%PREFIX%%

LANG=C
export LANG=C
LC_ALL=C
export LC_ALL

RETVAL=0
prog='mimedefang'
SPOOLDIR='/var/spool/MIMEDefang'
PID="$SPOOLDIR/$prog.pid"
MXPID="$SPOOLDIR/$prog-multiplexor.pid"
_MXPIDNO=`cat $MXPID`;

# Is the program executable?  We search in /usr/bin and /usr/local/bin.

if [ -x /$PREFIX/bin/$prog ] ; then
    PROGDIR=/$PREFIX/bin
elif [ -x /usr/bin/$prog ] ; then
    PROGDIR=/usr/bin
elif [ -x /usr/local/bin/$prog ] ; then
    PROGDIR=/usr/local/bin
else
    exit 0
fi

MX_EMBED_PERL=yes
MX_RECIPIENT_CHECK=yes

SOCKET=%%SOMESOCKET%%
MX_MIN_SLAVE_DELAY=0
MX_USER=mimedefang
SYSLOG_FACILITY=mail
MX_LOG=yes
MX_REQUESTS=100
MX_MINIMUM=20
MX_MAXIMUM=30
MX_IDLE=300
MX_BUSY=600
MX_BACKLOG=200
MX_QUEUE_SIZE=128
MX_QUEUE_TIMEOUT=60
MX_MAX_RSS=100000
MX_MAX_AS=120000
# Source configuration
if [ -f /$PREFIX/etc/mimedefang/$prog.conf ] ; then
    . /$PREFIX/etc/mimedefang/$prog.conf
fi

# Make sure required vars are set
SOCKET=${SOCKET:=$SPOOLDIR/$prog.sock}
MX_SOCKET=${MX_SOCKET:=$SPOOLDIR/$prog-multiplexor.sock}

start_it() {
    if test -r $PID ; then
        if kill -0 `cat $PID` > /dev/null 2>&1 ; then
            echo "mimedefang (`cat $PID`) seems to be running."
            return 1
        fi
    fi
    if test -r $MXPID ; then
        if kill -0 `cat $MXPID` > /dev/null 2>&1 ; then
            echo "mimedefang-multiplexor (`cat $MXPID`) seems to be running."
            return 1
        fi
    fi

    printf "%-60s" "Starting $prog-multiplexor: "
    rm -f $MX_SOCKET > /dev/null 2>&1
    if [ "$MX_EMBED_PERL" = "yes" ] ; then
        EMBEDFLAG=-E
    else
        EMBEDFLAG=""
    fi
    $PROGDIR/$prog-multiplexor -p $MXPID \
        $EMBEDFLAG \
        `[ -n "$FILTER" ] && echo "-f $FILTER"` \
        `[ -n "$SYSLOG_FACILITY" ] && echo "-S $SYSLOG_FACILITY"` \
        `[ -n "$SUBFILTER" ] && echo "-F $SUBFILTER"` \
        `[ -n "$MX_MINIMUM" ] && echo "-m $MX_MINIMUM"` \
        `[ -n "$MX_MAXIMUM" ] && echo "-x $MX_MAXIMUM"` \
        `[ -n "$MX_LOG_SLAVE_STATUS_INTERVAL" ] && echo "-L 
$MX_LOG_SLAVE_STATUS_INTERVAL"` \
        `[ -n "$MX_USER" ] && echo "-U $MX_USER"` \
        `[ -n "$MX_IDLE" ] && echo "-i $MX_IDLE"` \
        `[ -n "$MX_BACKLOG" ] && echo "-I $MX_BACKLOG"` \
        `[ -n "$MX_BUSY" ] && echo "-b $MX_BUSY"` \
        `[ -n "$MX_REQUESTS" ] && echo "-r $MX_REQUESTS"` \
        `[ -n "$MX_SLAVE_DELAY" ] && echo "-w $MX_SLAVE_DELAY"` \
        `[ -n "$MX_MIN_SLAVE_DELAY" ] && echo "-W $MX_MIN_SLAVE_DELAY"` \
        `[ -n "$MX_MAX_RSS" ] && echo "-R $MX_MAX_RSS"` \
        `[ -n "$MX_MAX_AS" ] && echo "-M $MX_MAX_AS"` \
        `[ "$MX_LOG" = "yes" ] && echo "-l"` \
        `[ "$MX_STATS" = "yes" ] && echo "-t /var/log/mimedefang/stats"` \
        `[ "$MX_STATS" = "yes" -a "$MX_FLUSH_STATS" = "yes" ] && echo "-u"` \
        `[ "$MX_STATS_SYSLOG" = "yes" ] && echo "-T"` \
        `[ -n "$MX_QUEUE_SIZE" ] && echo "-q $MX_QUEUE_SIZE"` \
        `[ -n "$MX_QUEUE_TIMEOUT" ] && echo "-Q $MX_QUEUE_TIMEOUT"` \
        `[ -n "$MX_NOTIFIER" ] && echo "-O $MX_NOTIFIER"` \
        -s $MX_SOCKET
    RETVAL=$?
    if [ $RETVAL = 0 ] ; then
        echo "[  OK  ]"
    else
        echo "[FAILED]"
        return 1
    fi

    # Start mimedefang
    printf "%-60s" "Starting $prog: "
    $PROGDIR/$prog -P $PID \
        -m $MX_SOCKET \
        `[ -n "$MX_USER" ] && echo "-U $MX_USER"` \
        `[ -n "$SYSLOG_FACILITY" ] && echo "-S $SYSLOG_FACILITY"` \
        `[ "$MX_RELAY_CHECK" = "yes" ] && echo "-r"` \
        `[ "$MX_SENDER_CHECK" = "yes" ] && echo "-s"` \
        `[ "$MX_RECIPIENT_CHECK" = "yes" ] && echo "-t"` \
        `[ "$KEEP_FAILED_DIRECTORIES" = "yes" ] && echo "-k"` \
        `[ "$ALLOW_NEW_CONNECTIONS_TO_QUEUE" = "yes" ] && echo "-q"` \
        `[ "$MD_EXTRA" != "" ] && echo $MD_EXTRA` \
        -p $SOCKET
    RETVAL=$?
    if [ $RETVAL = 0 ] ; then
        echo "[  OK  ]"
    else
        echo "[FAILED]"
        kill `cat $MXPID`
        return 1
    fi
    return 0
}

stop_it() {
    # Stop daemon
    printf "%-60s" "Shutting down $prog: "
    if test -f "$PID" ; then
        kill `cat $PID`
        RETVAL=$?
    else
        RETVAL=1
    fi
    if [ $RETVAL = 0 ] ; then
        echo "[  OK  ]"
    else
        echo "[FAILED]"
    fi

    rm -f $PID > /dev/null 2>&1

    # Stop daemon
    printf "%-60s" "Shutting down $prog-multiplexor: "
    if test -f "$MXPID" ; then
        kill `cat $MXPID`
        RETVAL=$?
    else
        RETVAL=1
    fi
    if [ $RETVAL = 0 ] ; then
        echo "[  OK  ]"
    else
        echo "[FAILED]"
    fi

    rm -f $MX_SOCKET > /dev/null 2>&1
    rm -f $MXPID > /dev/null 2>&1
}

check_sa() {
    #
    # Check for valid spamassassin config
    #
    SPAMOUTPUT=`/$PREFIX/bin/spamassassin --lint 2>&1`;
    SRETVAL=$?
    if [ $SRETVAL -ne 0 ]; then
        echo "SpamAssassin Config is incorrect, please run spamassassin --lint and 
fix the error.";
        RETVAL=1;
        exit $RETVAL;
    fi;
}

check_md() {
    #
    # Check for a valid mimedefang config
    #
    MDEFOUT=`$PREFIX/bin/mimedefang.pl -test 2>&1`;
    MRETVAL=$?
    if [ $MRETVAL -ne 0 ]; then
        echo "The File mimedefang-filter has a config error, please run 
mimedefang.pl -test and fix the error";
        RETVAL=1;
        exit $RETVAL;
    fi
}

# See how we were called.
case "$1" in
  start)
  start_it
    ;;

  stop)
  stop_it
    ;;

  restart)
    check_sa
    check_md
    if [ -r $MXPID ] ; then
        stop_it
    fi
    sleep 1;
    start_it
    RETVAL=$?
    ;;

  reread|reload)
    check_sa
    check_md
    if [ -r $MXPID ] ; then
        kill -INT `cat $MXPID`
        RETVAL=$?
        if [ $RETVAL = 0 ] ; then
            echo "Told $prog-multiplexor to force reread of filter rules."
        else
            echo "Could not signal $prog-multiplexor"
        fi
        sleep 5;
        #
        # Check for mimedefang crashes after reload.
        #
        OUTPUT=`ps -auxwww | egrep "^$MX_USER +$_MXPIDNO"`
        RETVAL=$?
        if [ $MRETVAL -ne 0 ]; then
                stop_it
                start_it
                RETVAL=$?
        fi
        if [ ! -r $MXPID ] ; then
                stop_it
                start_it
                RETVAL=$?
        fi
        chown -R $MX_USER /$PREFIX/var/bayes
    else
        echo "Could not find process-ID of $prog-multiplexor"
        start_it
        RETVAL=$?
        exit $RETVAL
    fi
    ;;

  *)
    echo "Usage: $0 {start|stop|restart|reread|reload}"
    exit 1
esac

exit $RETVAL
_______________________________________________
Visit http://www.mimedefang.org and http://www.canit.ca
MIMEDefang mailing list
MIMEDefang@lists.roaringpenguin.com
http://lists.roaringpenguin.com/mailman/listinfo/mimedefang

Reply via email to