12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- #!/bin/sh
- # We are trying to be nice.
- # TERM everybody. Give them some time to die.
- # KILL might make some filesystems non-unmountable,
- # so we'll do it in stop_storage instead.
- killcnt=30
- PATH=/sbin:/usr/sbin:/bin:/usr/bin
- echo "<*> `date '+%Y-%m-%d %H:%M:%S'` Executing '$0 $*'"
- showps() {
- # sleep 1 ensures that xargs will have time to start up.
- # This makes pslist less prone to random jitter.
- pslist=`{ sleep 1; ps -A -o comm=; } | sort | xargs`
- pscnt=$(( `echo "$pslist" | wc -w` + 0 ))
- if test x"$VERBOSE" = x; then
- echo "* `date '+%H:%M:%S'` $pscnt processes"
- else
- echo "* `date '+%H:%M:%S'` Processes ($pscnt): $pslist"
- fi
- }
- # Sync.
- # Rationale: sometimes buggy root processes can
- # hang the system when killed (X for example may have problems
- # with restoring text mode on a poorly supported hardware).
- # These are bugs and must be fixed, but until then users will lose
- # dirty data on shutdown! Let's make that less likely.
- sync &
- # Send SIGTERMs. If list of processes changes, proceed slower.
- # If it has stabilised (all who wanted to, exited), proceed faster.
- showps
- i="$killcnt"
- while test "$i" -gt 0; do
- echo "* `date '+%H:%M:%S'` Sending CONT, TERM" #, HUP"
- # I've seen "killall5 2.86" which doesn't grok signal names!
- killall5 -18
- killall5 -15
- #killall5 -1 # HUP: because interactive bash does not die on TERM...
- # but init will reread /etc/inittab on HUP and my /etc is on non root fs!
- # -> umounts will complain.
- oldpslist="$pslist"
- showps
- if test x"$pslist" = x"$oldpslist"; then
- i=$((i-8))
- fi
- i=$((i-2))
- done
- echo "* `date '+%H:%M:%S'` Turning off swap"
- swapoff -a
- cat /proc/swaps | grep -v ^Filename | cut -d ' ' -f1 \
- | while read -r line; do
- test "$line" && {
- echo swapoff "$line"
- swapoff "$line"
- }
- done
- echo "* /proc/swaps:"
- cat /proc/swaps
- echo "* /proc/mounts:"
- cat /proc/mounts
- echo "* ps -A e:"
- ps -A e
- echo "* top -bn1:"
- top -bn1
|