aboutsummaryrefslogtreecommitdiff
path: root/examples/shutdown-1.0/script/shutdown
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2018-04-20 15:12:52 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2018-04-20 15:12:52 +0200
commitc21dfaf836cf0eb5317035bc20395c751a205934 (patch)
tree1b9b812eb0153da450a7f9f14fd444dc0bc4b567 /examples/shutdown-1.0/script/shutdown
parente09c426456cfd030cc868d93bbcb2e0a6933cabb (diff)
downloadbusybox-c21dfaf836cf0eb5317035bc20395c751a205934.tar.gz
examples/shutdown-1.0: an example of reboot which does not signal init
For one, my inits know nothing about the concept of "shutting down the system". Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'examples/shutdown-1.0/script/shutdown')
-rwxr-xr-xexamples/shutdown-1.0/script/shutdown64
1 files changed, 64 insertions, 0 deletions
diff --git a/examples/shutdown-1.0/script/shutdown b/examples/shutdown-1.0/script/shutdown
new file mode 100755
index 000000000..dbab9d81e
--- /dev/null
+++ b/examples/shutdown-1.0/script/shutdown
@@ -0,0 +1,64 @@
+#!/bin/sh
+
+PATH=/sbin:/usr/sbin:/bin:/usr/bin
+
+# Usually, /sbin/ has symlinks named halt, reboot, poweroff
+# (and also possibly shutdown) to e.g.
+# /app/shutdown-1.0/script/shutdown (this file).
+cd /app/shutdown-1.0/script || exit 1
+test -x ./do_shutdown || exit 1
+test -x ./hardshutdown || exit 1
+
+# "reboot -f" -> "shutdown -f -r" -> "hardshutdown -r" -> immediate reboot
+# "reboot" -> "shutdown -r" -> "do_shutdown -r"
+# ^^^^^^^^^^^^^^^^^^ similarly for halt, poweroff.
+# "shutdown" -> "do_shutdown" (everything killed/unmounted, but kernel not asked to do any poweroff etc)
+force=""
+test x"$1" = x"-f" && {
+ force="-f"
+ shift
+}
+test ! "$*" && test x"${0##*/}" = x"halt" && exec "$0" $force -h
+test ! "$*" && test x"${0##*/}" = x"reboot" && exec "$0" $force -r
+test ! "$*" && test x"${0##*/}" = x"poweroff" && exec "$0" $force -p
+# We have something else than allowed parameters?
+test x"$*" = x"" || test x"$*" = x"-h" || test x"$*" = x"-r" || test x"$*" = x"-p" || {
+ echo "Syntax: $0 [-f] [-h/-r/-p]"
+ exit 1
+}
+
+# Emergency shutdown?
+test "$force" && {
+ exec ./hardshutdown "$@"
+ exit 1
+}
+
+# Normal shutdown
+
+# We must have these executables on root fs
+# (mount/umount aren't checked, all systems are ok versus that):
+test -x /bin/killall5 -o -x /sbin/killall5 || exit 1
+test -x /bin/ps -o -x /sbin/ps || exit 1
+test -x /bin/date -o -x /sbin/date || exit 1
+test -x /bin/xargs -o -x /sbin/xargs || exit 1
+test -x /bin/wc -o -x /sbin/wc || exit 1
+test -x /bin/cat -o -x /sbin/cat || exit 1
+test -x /bin/sort -o -x /sbin/sort || exit 1
+
+i="`ulimit -n`"
+echo -n "Closing file descriptors $i-3... "
+while test "$i" -ge 3; do
+ eval "exec $i>&-"
+ i=$((i-1))
+done
+
+echo "Shutting down. Please stand by..."
+
+# setsid & /dev/null:
+# make it a process leader & detach it from current tty.
+# Why /dev/null and not /dev/console?
+# I have seen a system which locked up while opening /dev/console
+# due to the bug (?) in keyboard driver.
+setsid env - PATH="$PATH" ./do_shutdown "$@" </dev/null >/dev/null 2>&1 &
+
+while true; do read junk; done