#!/bin/rc # fshalt [-r] - sync (flush) and, if possible, halt all file servers # and optionally reboot rfork en reboot=no scram=no while (~ $1 -*){ switch($1){ case -r reboot=yes shift case -n scram=noscram shift case * echo usage: $0 '[-r] [-n]' >[1=2] exit usage } } path=(/bin) builtin cd / bind -c '#s' /srv bind '#p' /proc unmount /mnt/consoles >[2]/dev/null kill consolefs | rc # don't compete with /mnt/consoles sleep 1 c=`{ls /srv/cwfs*cmd >[2]/dev/null} h=`{ls /srv/hjfs*cmd >[2]/dev/null} f=`{ls /srv/fscons* >[2]/dev/null} # for scram, don't scram other systems if(! ~ $scram noscram){ bind -b '#P' /dev if(! ~ $reboot yes){ if (test -e '#P'/apm) scram=yes if (test -e '#P'/acpitbls -a -e '#P'/iow) scram=yes } } for(i in $f){ echo -n $i venti/sync -h localhost >[2]/dev/null & venti/sync >[2]/dev/null & sleep 2 echo -n '...sync...' { echo echo 'fsys all sync' sleep 4 } < $i >> $i venti/sync -h localhost >[2]/dev/null & venti/sync >[2]/dev/null & sleep 2 } # halting (binaries we run can't be on the fs we're halting) ramfs builtin cd /tmp cp /bin/echo /tmp mkdir /tmp/lib cp /rc/lib/rcmain /tmp/lib cp /bin/ns /tmp cp /bin/rc /tmp cp /bin/sed /tmp cp /bin/sleep /tmp cp /bin/scram /tmp cp /bin/test /tmp bind /tmp /rc bind /tmp /bin # put this in a shell function so this rc script doesn't get read # when it's no longer accessible fn x { echo echo -n halting... for (i in $c $h) echo halt >>$i for (i in $c $h){ echo -n $i... while(test -e $i) sleep 1 } for(i in $f){ echo fsys all halt >>$i sleep 3 } echo echo done halting if (~ $reboot yes) { echo rebooting... echo reboot >'#c/reboot' } if (~ $scram yes){ scram echo 'It''s now safe to turn off your computer' } } x