sendmailの起動スクリプトについて




通常、sendmailを起動したり停止したりする際には起動スクリプトを使用するのだが、
sendmail8.12以降、動作が変わったため起動スクリプトも変わってきている

Solaris9でデフォルトでインストールされるsendmailの起動スクリプトは次の通り
#!/sbin/sh
#
# Copyright (c) 1992 - 2001 by Sun Microsystems, Inc.
# All rights reserved.
#
#ident  "@(#)sendmail   1.19    01/12/05 SMI"

ERRMSG1='WARNING: /var/mail is NFS-mounted without setting actimeo=0,'
ERRMSG2='this can cause mailbox locking and access problems.'
SERVER_PID_FILE="/var/run/sendmail.pid"
CLIENT_PID_FILE="/var/spool/clientmqueue/sm-client.pid"
DEFAULT_FILE="/etc/default/sendmail"
ALIASES_FILE="/etc/mail/aliases"

check_queue_interval_syntax()
{
        default="15m"
        if [ $# -lt 1 ]; then
                answer=$default
                return
        fi
        if echo $1 | egrep '^([0-9]*[1-9][0-9]*[smhdw])+$' >/dev/null 2>&1; then
                answer=$1
        else
                answer=$default
        fi
}

case "$1" in
'restart')
        [ -f $SERVER_PID_FILE ] && kill -1 `head -1 $SERVER_PID_FILE`
        [ -f $CLIENT_PID_FILE ] && kill -1 `head -1 $CLIENT_PID_FILE`
        ;;

'start')
        if [ -f /usr/lib/sendmail -a -f /etc/mail/sendmail.cf ]; then
                if [ ! -d /var/spool/mqueue ]; then
                        /usr/bin/mkdir -m 0750 /var/spool/mqueue
                        /usr/bin/chown root:bin /var/spool/mqueue
                fi
                if [ ! -f $ALIASES_FILE.db ] && [ ! -f $ALIASES_FILE.dir ] \
                    && [ ! -f $ALIASES_FILE.pag ]; then
                        /usr/sbin/newaliases
                fi
                MODE="-bd"
                [ -f $DEFAULT_FILE ] && . $DEFAULT_FILE
                #
                # * MODE should be "-bd" or null (MODE= or MODE="") or
                #   left alone.  Anything else and you're on your own.
                # * QUEUEOPTION should be "p" or null (as above).
                # * [CLIENT]QUEUEINTERVAL should be set to some legal value;
                #   sanity checks are done below.
                # * [CLIENT]OPTIONS are catch-alls; set with care.
                #
                if [ -n "$QUEUEOPTION" -a "$QUEUEOPTION" != "p" ]; then
                        QUEUEOPTION=""
                fi
                if [ -z "$QUEUEOPTION" -o -n "$QUEUEINTERVAL" ]; then
                        check_queue_interval_syntax $QUEUEINTERVAL
                        QUEUEINTERVAL=$answer
                fi
                check_queue_interval_syntax $CLIENTQUEUEINTERVAL
                CLIENTQUEUEINTERVAL=$answer
                /usr/lib/sendmail $MODE -q$QUEUEOPTION$QUEUEINTERVAL $OPTIONS &
                /usr/lib/sendmail -Ac -q$CLIENTQUEUEINTERVAL $CLIENTOPTIONS & ←増えた部分!
                #
                # ETRN_HOSTS should be of the form
                # "s1:c1.1,c1.2        s2:c2.1 s3:c3.1,c3.2,c3.3"
                # i.e., white-space separated groups of server:client where
                # client can be one or more comma-separated names; N.B. that
                # the :client part is optional; see etrn(1M) for details.
                # server is the name of the server to prod; a mail queue run
                # is requested for each client name.  This is comparable to
                # running "/usr/lib/sendmail -qRclient" on the host server.
                #
                # See RFC 1985 for more information.
                #
                for i in $ETRN_HOSTS; do
                        SERVER=`echo $i | /usr/bin/sed -e 's/:.*$//'`
                        CLIENTS=`echo $i | /usr/bin/sed -n -e 's/,/ /g' \
                            -e '/:/s/^.*://p'`
                        /usr/sbin/etrn $SERVER $CLIENTS >/dev/null 2>&1 &
                done
        fi

        if /usr/bin/nawk 'BEGIN{s = 1}
            $2 == "/var/mail" && $3 == "nfs" && $4 !~ /actimeo=0/ &&
            $4 !~ /noac/{s = 0} END{exit s}' /etc/mnttab; then

                /usr/bin/logger -p mail.crit "$ERRMSG1"
                /usr/bin/logger -p mail.crit "$ERRMSG2"
        fi
        ;;

'stop')
        [ -f $SERVER_PID_FILE ] && kill `head -1 $SERVER_PID_FILE`
        if [ -f $CLIENT_PID_FILE ]; then
                kill `head -1 $CLIENT_PID_FILE`
                rm -f $CLIENT_PID_FILE
        fi
        /usr/bin/pkill -x -u 0 sendmail
        ;;

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

Solaris8でデフォルトでインストールされるsendmailの起動スクリプトは次の通り
#!/sbin/sh
#
# Copyright (c) 1997 by Sun Microsystems, Inc.
# All rights reserved.
#
#ident  "@(#)sendmail   1.15    98/06/22 SMI"

ERRMSG1='WARNING: /var/mail is NFS-mounted without setting actimeo=0,'
ERRMSG2='this can cause mailbox locking and access problems.'

case "$1" in
'start')
        if [ -f /usr/lib/sendmail -a -f /etc/mail/sendmail.cf ]; then
                if [ ! -d /var/spool/mqueue ]; then
                        /usr/bin/mkdir -m 0750 /var/spool/mqueue
                        /usr/bin/chown root:bin /var/spool/mqueue
                fi
                /usr/lib/sendmail -bd -q15m &
        fi

        if /usr/bin/nawk 'BEGIN{s = 1}
            $2 == "/var/mail" && $3 == "nfs" && $4 !~ /actimeo=0/ &&
            $4 !~ /noac/{s = 0} END{exit s}' /etc/mnttab; then

                /usr/bin/logger -p mail.crit "$ERRMSG1"
                /usr/bin/logger -p mail.crit "$ERRMSG2"
        fi
        ;;

'stop')
        pid=`/usr/bin/ps -eo pid,comm | /usr/bin/awk '{ if ($2 == "/usr/lib/sendmail") print $1 }'`
        if test "$pid"
        then
                /usr/bin/kill $pid
        fi

        ;;

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

全体的に変わってはいるが基本的にやっていることは同じ。
一点、昔の起動スクリプトと比べると明らかに増えた部分がある。
それにより、この起動スクリプトで起動すると、2つのsendmailプロセスが起動する

# ps -ef | grep sendmail
   smmsp  2184     1  0 11:42:15 ?        0:00 /usr/lib/sendmail -Ac -q15m
    root  2181     1  0 11:42:15 ?        0:00 /usr/lib/sendmail -bd -q15m

「sendmail -bd -q15m」の方はメインのsendmailプロセス ←昔はこちらだけだった
「sendmail -Ac -q15m」の方はローカルのためのプロセス