| #!/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 |