Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 22 Sep 2002 22:20:12 +0300
From:      Petri Riihikallio <Petri.Riihikallio@Metis.fi>
To:        freebsd-questions@FreeBSD.ORG, DougB@FreeBSD.ORG
Subject:   How to shut down cleanly by killing power
Message-ID:  <a05111b01b9b3b556dcb1@[192.168.0.2]>

next in thread | raw e-mail | index | archive | help
Hello

I have a FreeBSD 4.6.2 box and an UPS. I have chosen NUT 
(http://www.exploits.org/nut) as my UPS monitor. Everything compiles 
and runs fine. I have a problem with the shutdown script.

How do I shut down the system properly?

The problem is that I want to issue the command "upsdrvctl shutdown", 
which switches off the power from the UPS. What do I need to do 
before that?

To be more specific. I have put a script like this in my /usr/local/etc/rc.d

-------------------------/usr/local/etc/rc.d/znut.sh:
#! /bin/sh
case $1 in
start)
	su nut -c /usr/local/libexec/upsdrvctl start
	su nut -c /usr/local/sbin/upsd
	/usr/local/upsmon
	;;
stop)
	if (test -f /etc/killpower) then
		echo "Killing the power, bye!"
		/bin/sync
		### what to do here ?
		/usr/local/bin/upsdrvctl shutdown
		### never makes it this far
	else
		killall upsmon
		killall upsd
		/usr/local/libexec/upsdrvctl stop
	fi
	;;
*)
         echo "Usage: $0: [ start | stop ]" 2>&1
         exit 65
	;;
esac
---------------------------------------------------

I have called it znut.sh, so it should run last after all other 
shutdown scripts. (Nothing else runs after it in a powerfail 
situation ;-) Can I rely on alphabetical ordering?

When the AC power is down and the UPS is almost exhausted, NUT 
creates a file "/etc/killpower" and starts system shutdown with 
"shutdown -h now". Init then runs all scripts in /usr/local/etc/rc.d 
with argument "stop".

When the script finds the "/etc/killpower" file it syncs the disks 
and switches the UPS off. This is necessary, since the power might 
return when the system is in the "Press any key to reboot"-state. 
Then it would wait for the keypress indefinitely.

NUT can't use "shutdown -r now", since the system might start a 
reboot while the UPS still supplies power. NUT can't use "shutdown -p 
now", since if the power is restored before the UPS runs dry, the 
system won't boot automatically.

The "upsdrvctl shutdown" avoids these deadlocks by killing power at 
the UPS. When the AC power returns, the UPS first recharges, then it 
starts supplying power and my BIOS is set up to boot when power 
returns.

My problem is that the disks aren't clean.

If I put "umount -a" after the sync, I can't run the upsdrvctl from 
/usr. Should I remount /usr read-only? Or should I move the NUT 
programs to /bin and "umount -A". This would leave root dirty.

I have read man pages for mount and umount. Both provide the -f flag, 
but warn against using it. Could I make use of it?

The "sync" man page tells that halt is better since it does more than 
just a sync. Can I emulate these functions of halt from a script?

What happens after the rc.shutdown? Are there any other housekeeping 
tasks after user scripts? I couldn't find any docs on that.
-- 
Cheers,
Petri

Metis / Petri Riihikallio
GSM: +358 400 505 939

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-questions" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?a05111b01b9b3b556dcb1>