71 lines
1.9 KiB
Plaintext
71 lines
1.9 KiB
Plaintext
|
#!/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
|