/init.d/sendsigs
http://github.com/brinkman83/bashrc · Shell · 120 lines · 71 code · 14 blank · 35 comment · 15 complexity · 2a1f251ca12ef06f46a166f9a37e2400 MD5 · raw file
- #! /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
- report_unkillable() {
- [ -x /usr/share/apport/unkillable_shutdown ] || return
- if [ ! -e /etc/default/apport ] || ! grep -q '^enabled[[:space:]]*=[[:space:]]*1' /etc/default/apport; then
- return
- fi
- /usr/share/apport/unkillable_shutdown $OMITPIDS
- }
- do_stop () {
- OMITPIDS=
- # The /var/run/sendsigs.omit file is used to be compatible
- # with Ubuntu.
- for omitfile in /var/run/sendsigs.omit /lib/init/rw/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.
- if [ -d /lib/init/rw/sendsigs.omit.d/ ]; then
- for pidfile in /lib/init/rw/sendsigs.omit.d/*; do
- [ -f "$pidfile" ] || continue
- for pid in $(cat $pidfile); do
- OMITPIDS="${OMITPIDS:+$OMITPIDS }-o $pid"
- done
- done
- fi
- # 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
- for pid in $(initctl list | sed -n -e "/process [0-9]/s/.*process //p"); do
- OMITPIDS="${OMITPIDS:+$OMITPIDS }-o $pid"
- done
- # 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.
- for pid in $(initctl list | sed -n -e "/process [0-9]/s/.*process //p"); do
- OMITPIDS="${OMITPIDS:+$OMITPIDS }-o $pid"
- done
-
- if killall5 -18 $OMITPIDS ; then
- :
- else
- alldead=1
- break
- fi
- sleep 1
- done
- if [ -z "$alldead" ] ; then
- log_action_begin_msg "Killing all remaining processes"
- #report_unkillable
- 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)
- # 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
- :