Re: [exim] Debian-Bug not stopping exim

Top Page

Reply to this message
Author: Klaus Ethgen
To: exim-users
Subject: Re: [exim] Debian-Bug not stopping exim

Am Mi den 6. Feb 2019 um 10:45 schrieb Evgeniy Berdnikov via Exim-users:
> On Wed, Feb 06, 2019 at 09:47:04AM +0100, Klaus Ethgen via Exim-users wrote:
> > did anybody already debug and fix the problem in debian that exim is not
> > stopped with stop action anymore?
> >
> > Problem is, that /etc/init.d/exim4 seems to call killproc which calls
> > start-stop-daemon to stop the daemon in stop or restart. When the return
> > state is 0 it removes the PIDFILE.
> Yes, pidfile is removed on "stop" action. But I see no problem so far.

So far I also don't see a problem.

> > Unfortunately, start-stop-daemon seems to refuse the daemon when given a
> > pidfile.
> Do you mean that start-stop-daemon does not search for a process by
> its name if pidfile is given? It's right, but it's unusual situation
> if you have listening daemon running with pid != pidfile.
> You have better to ask yourself how it could happen.

Well, the relevant part of the init-script is:
  if [ -f "$QRPIDFILE" ]; then
    killproc -p "$QRPIDFILE" "$DAEMON"
    # exim does not remove the pidfile
    if [ $? -eq 0 ] ; then rm -f "$QRPIDFILE" ; fi
    log_progress_msg "exim4_queuerunner"
  if [ -f "$PIDFILE" ]; then
    killproc -p "$PIDFILE" "$DAEMON"
    # exim does not remove the pidfile
    if [ $? -eq 0 ] ; then rm -f "$PIDFILE" ; fi
    log_progress_msg "exim4_listener"

That looks promising and ok.

Now for the definition of killproc:
   killproc () {
       local pidfile sig status base name_param is_term_sig OPTIND

       while getopts p: opt ; do
       case "$opt" in
           p)  pidfile="$OPTARG";;
       shift $(($OPTIND - 1))

       if [ ! $pidfile ]; then
       name_param="--name $base --pidfile /var/run/$"
       name_param="--pidfile $pidfile"

       sig=$(echo ${2:-} | sed -e 's/^-\(.*\)/\1/')
       sig=$(echo $sig | sed -e 's/^SIG\(.*\)/\1/')
       if [ "$sig" = 15 ] || [ "$sig" = TERM ]; then
       if [ ! "$is_term_sig" ]; then
       if [ -n "$sig" ]; then
           /sbin/start-stop-daemon --stop --signal "$sig" \
           --quiet $name_param || status="$?"
           /sbin/start-stop-daemon --stop \
           --retry 5 \
           --quiet $name_param || status="$?"
       /sbin/start-stop-daemon --stop --quiet \
           --oknodo $name_param || status="$?"
       if [ "$status" = 1 ]; then
       if [ -z "$sig" ]; then
           return 0
       return 3 # program is not running

       if [ "$status" = 0 ] && [ "$is_term_sig" ] && [ "$pidfile" ]; then
       pidofproc -p "$pidfile" "$1" >/dev/null || rm -f "$pidfile"
       return 0

But, and that did change somewhen in the past months, start-stop-daemon
seems to _not_ stop exim with that anymore. Both definitions above did
not change for longer times. Just start-stop-daemon did.

I checked, before I do a "/etc/init.d/exim4 stop", the pid file contains
the correct PID of the exim process. And the rights are:
   ~> ll -a /run/exim4
   insgesamt 4,0K
   drwxr-x---  2 Debian-exim Debian-exim  60 Feb  6 09:21 .
   drwxr-xr-x 27 root        root        980 Feb  6 10:14 ..
   -rw-r--r--  1 root        Debian-exim   6 Feb  6 09:21

After the stop, exim is still running but the pid file is gone.

And I get the message on the console:
~> /etc/init.d/exim4 stop
[....] Stopping MTA:/sbin/start-stop-daemon: matching only on non-root pidfile /run/exim4/ is insecure
[ ok 4_listener.

> > But it does not error out than just return with 0. So the
> > pidfile is gone afterwards.
> In this case pidfile was gone BEFORE start-stop-daemon invocation.


> This is exceptional situation, it requires manual dignostics.

That is what I do currently.

> It's not good thing to "resolve" such situations automatically
> unless you clearly understand what happens and why it can't be
> resolved in other ways.

Well, it is clearly not a fine situation why since some days a restart
of exim fills my paniclog.

For the record, exim is not restarted for logrotation but from
needrestart or manualy.

So there was a bug introduced in the last few weeks in start-stop-daemon
that I have to find a way around. The current situation is not

- -- 
Klaus Ethgen                             
pub  4096R/4E20AF1C 2011-05-16            Klaus Ethgen <Klaus@???>
Fingerprint: 85D4 CA42 952C 949B 1753  62B3 79D0 B06F 4E20 AF1C