From c21dfaf836cf0eb5317035bc20395c751a205934 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Fri, 20 Apr 2018 15:12:52 +0200 Subject: 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 --- examples/shutdown-1.0/script/shutdown | 64 +++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100755 examples/shutdown-1.0/script/shutdown (limited to 'examples/shutdown-1.0/script/shutdown') 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 2>&1 & + +while true; do read junk; done -- cgit v1.2.3