#!/bin/sh # We are called with stdin/out/err = /dev/null resetgracetime=60 logfile="/var/log/reboot/`date '+%Y%m%d%H%M%S'`.log" mkdir -p /var/log/reboot PATH=/sbin:/bin say() { printf "\r%s\n\r" "$*" } # Since there is a potential for various fuckups during umount, # we start delayed hard reboot here which will forcibly # reboot hung box in a remote datacenter a thousand miles away ;) if test "$1" = "-r"; then ./hardshutdown -r "$resetgracetime" & fi # Now, (try to) switch away from X and open a console. I've seen reboots # hung on open("/dev/console"), therefore we do it _after_ hardshutdown exec >/dev/console 2>&1 if test "$1" = "-r"; then say "* `date '+%H:%M:%S'` Scheduled hard reboot in $resetgracetime seconds" fi say "* `date '+%H:%M:%S'` Stopping tasks (see /var/log/reboot/* files)" # log reboot event to file. %Y%m%d%H%M%S: YYYYMMDDHHMMSS ./stop_tasks >"$logfile" 2>&1 # Dying X tends to leave us at semi-random vt. Try to fix that, # but if it doesn't work, proceed anyway. exec >/dev/null 2>&1 chvt 1 & sleep 1 exec >/dev/console 2>&1 command -v ctrlaltdel >/dev/null && { say "* `date '+%H:%M:%S'` Setting Ctrl-Alt-Del to 'hard'" ctrlaltdel hard } say "* `date '+%H:%M:%S'` Stopping storage devices" # we can't log this: we are about to unmount everything! ./stop_storage "$@" # If we have cmdline params, start hardshutdown with them test "$*" && ./hardshutdown "$@" # Just sleep endlessly... say "* `date '+%H:%M:%S'` You may now power off or press Ctrl-Alt-Del to reboot" while true; do sleep 32000; done