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