:: [devuan-dev] bug#599: initscripts: …
Top Page
Delete this message
Reply to this message
Author: Jerome BENOIT
Date:  
To: 599
Subject: [devuan-dev] bug#599: initscripts: typo in /etc/init.d/sendsigs (easy fix)
On Sat, 7 Aug 2021 19:23:56 +0100 Mark Hindley <mark@???> wrote:
> Control: tags -1 moreinfo


Actually I think that my first fix was actually incorrect.

Please find in attachment the current version, "my" current version, and
the corresponding patch.

I think that otherwise these loops make no sense.

Cheers,
Jerome
--- sendsigs-dpkg-dist-with_typo    2019-02-26 17:59:47.000000000 +0100
+++ sendsigs    2021-08-07 22:45:52.619263748 +0200
@@ -27,8 +27,8 @@
 do_stop () {
     OMITPIDS=


-    for omitfile in /run/sendsigs.omit; do
-        if [ -e $omitfile ]; then
+    for omitfile in /run/sendsigs.omit.d/*; do
+        if [ -f $omitfile ]; then
             for pid in $(cat $omitfile); do
                 OMITPIDS="${OMITPIDS:+$OMITPIDS }-o $pid"
             done
@@ -38,7 +38,7 @@
     # Load sendsigs.omit.d/packagename files too, to make it
     # possible for scripts that need to modify the list of pids at
     # run time without race conditions.
-    for omitdir in /run/sendsigs.omit.d; do
+    for omitdir in /run/sendsigs.omit.d/*; do
         if [ -d "${omitdir}" ]; then
             for pidfile in "${omitdir}/"*; do
                 [ -f "$pidfile" ] || continue

#! /bin/sh
### BEGIN INIT INFO
# Provides:          sendsigs
# Required-Start:    
# Required-Stop:     umountnfs
# Default-Start:
# Default-Stop:      0 6
# Short-Description: Kill all remaining processes.
# Description: 
### END INIT INFO


PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/lsb/init-functions

# Make it possible to see who the misbehaving processes are
report_unkillable() {
    if [ -x /usr/bin/pstree ] ; then
        echo "Currently running processes (pstree):"
        pstree
    elif [ -x /bin/ps ] ; then
        echo "Currently running processes (ps):"
        ps -ef
    fi
}


do_stop () {
    OMITPIDS=


    for omitfile in /run/sendsigs.omit.d/*; do
        if [ -f $omitfile ]; then
            for pid in $(cat $omitfile); do
                OMITPIDS="${OMITPIDS:+$OMITPIDS }-o $pid"
            done
        fi
    done


    # Load sendsigs.omit.d/packagename files too, to make it
    # possible for scripts that need to modify the list of pids at
    # run time without race conditions.
    for omitdir in /run/sendsigs.omit.d/*; do
        if [ -d "${omitdir}" ]; then
            for pidfile in "${omitdir}/"*; do
                [ -f "$pidfile" ] || continue
                for pid in $(cat $pidfile); do
                    OMITPIDS="${OMITPIDS:+$OMITPIDS }-o $pid"
                done
            done
        fi
    done


    # Upstart jobs have their own "stop on" clauses that sends
    # SIGTERM/SIGKILL just like this, so if they're still running,
    # they're supposed to be
    if [ -x /sbin/initctl ]; then
        for pid in $(initctl list | sed -n -e "/process [0-9]/s/.*process //p"); do
            OMITPIDS="${OMITPIDS:+$OMITPIDS }-o $pid"
        done
    fi


    # Flush the kernel I/O buffer before we start to kill
    # processes, to make sure the IO of already stopped services to
    # not slow down the remaining processes to a point where they
    # are accidentily killed with SIGKILL because they did not
    # manage to shut down in time.
    sync


    # Kill all processes.
    log_action_begin_msg "Asking all remaining processes to terminate"
    killall5 -15 $OMITPIDS # SIGTERM
    log_action_end_msg 0
    alldead=""
    for seq in 1 2 3 4 5 6 7 8 9 10; do
        # use SIGCONT/signal 18 to check if there are
        # processes left.  No need to check the exit code
        # value, because either killall5 work and it make
        # sense to wait for processes to die, or it fail and
        # there is nothing to wait for.


        # did an upstart job start since we last polled initctl? check
        # again on each loop and add any new jobs (e.g., plymouth) to
        # the list.  If we did miss one starting up, this beats waiting
        # 10 seconds before shutting down.
        if [ -x /sbin/initctl ]; then
            for pid in $(initctl list | sed -n -e "/process [0-9]/s/.*process //p"); do
            OMITPIDS="${OMITPIDS:+$OMITPIDS }-o $pid"
            done
        fi
        if killall5 -18 $OMITPIDS ; then
            :
        else
            alldead=1
            break
        fi


        sleep 1
    done
    if [ -z "$alldead" ] ; then
        report_unkillable
        log_action_begin_msg "Killing all remaining processes"
        killall5 -9 $OMITPIDS # SIGKILL
        log_action_end_msg 1
    else
        log_action_begin_msg "All processes ended within $seq seconds"
        log_action_end_msg 0
    fi
}


case "$1" in
  start|status)
    # No-op
    ;;
  restart|reload|force-reload)
    echo "Error: argument '$1' not supported" >&2
    exit 3
    ;;
  stop)
    do_stop
    ;;
  *)
    echo "Usage: $0 start|stop" >&2
    exit 3
    ;;
esac


:
#! /bin/sh
### BEGIN INIT INFO
# Provides:          sendsigs
# Required-Start:    
# Required-Stop:     umountnfs
# Default-Start:
# Default-Stop:      0 6
# Short-Description: Kill all remaining processes.
# Description: 
### END INIT INFO


PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/lsb/init-functions

# Make it possible to see who the misbehaving processes are
report_unkillable() {
    if [ -x /usr/bin/pstree ] ; then
        echo "Currently running processes (pstree):"
        pstree
    elif [ -x /bin/ps ] ; then
        echo "Currently running processes (ps):"
        ps -ef
    fi
}


do_stop () {
    OMITPIDS=


    for omitfile in /run/sendsigs.omit; do
        if [ -e $omitfile ]; then
            for pid in $(cat $omitfile); do
                OMITPIDS="${OMITPIDS:+$OMITPIDS }-o $pid"
            done
        fi
    done


    # Load sendsigs.omit.d/packagename files too, to make it
    # possible for scripts that need to modify the list of pids at
    # run time without race conditions.
    for omitdir in /run/sendsigs.omit.d; do
        if [ -d "${omitdir}" ]; then
            for pidfile in "${omitdir}/"*; do
                [ -f "$pidfile" ] || continue
                for pid in $(cat $pidfile); do
                    OMITPIDS="${OMITPIDS:+$OMITPIDS }-o $pid"
                done
            done
        fi
    done


    # Upstart jobs have their own "stop on" clauses that sends
    # SIGTERM/SIGKILL just like this, so if they're still running,
    # they're supposed to be
    if [ -x /sbin/initctl ]; then
        for pid in $(initctl list | sed -n -e "/process [0-9]/s/.*process //p"); do
            OMITPIDS="${OMITPIDS:+$OMITPIDS }-o $pid"
        done
    fi


    # Flush the kernel I/O buffer before we start to kill
    # processes, to make sure the IO of already stopped services to
    # not slow down the remaining processes to a point where they
    # are accidentily killed with SIGKILL because they did not
    # manage to shut down in time.
    sync


    # Kill all processes.
    log_action_begin_msg "Asking all remaining processes to terminate"
    killall5 -15 $OMITPIDS # SIGTERM
    log_action_end_msg 0
    alldead=""
    for seq in 1 2 3 4 5 6 7 8 9 10; do
        # use SIGCONT/signal 18 to check if there are
        # processes left.  No need to check the exit code
        # value, because either killall5 work and it make
        # sense to wait for processes to die, or it fail and
        # there is nothing to wait for.


        # did an upstart job start since we last polled initctl? check
        # again on each loop and add any new jobs (e.g., plymouth) to
        # the list.  If we did miss one starting up, this beats waiting
        # 10 seconds before shutting down.
        if [ -x /sbin/initctl ]; then
            for pid in $(initctl list | sed -n -e "/process [0-9]/s/.*process //p"); do
            OMITPIDS="${OMITPIDS:+$OMITPIDS }-o $pid"
            done
        fi
        if killall5 -18 $OMITPIDS ; then
            :
        else
            alldead=1
            break
        fi


        sleep 1
    done
    if [ -z "$alldead" ] ; then
        report_unkillable
        log_action_begin_msg "Killing all remaining processes"
        killall5 -9 $OMITPIDS # SIGKILL
        log_action_end_msg 1
    else
        log_action_begin_msg "All processes ended within $seq seconds"
        log_action_end_msg 0
    fi
}


case "$1" in
  start|status)
    # No-op
    ;;
  restart|reload|force-reload)
    echo "Error: argument '$1' not supported" >&2
    exit 3
    ;;
  stop)
    do_stop
    ;;
  *)
    echo "Usage: $0 start|stop" >&2
    exit 3
    ;;
esac


: