ref: 53fa826a8a695bcfade5c47f636f719c71e96b98
dir: /rc/bin/fshalt/
#!/bin/rc # fshalt [-r [kernel]] - sync (flush) and, if possible, halt all file servers # and optionally reboot rfork en reboot=no bootf=() if(~ $1 -r){ reboot=yes shift } if not if(! ~ $#* 0 && ! ~ $#* 1){ echo usage: $0 '[-r bootkern]' >[1=2] exit usage } if(~ $reboot yes && ~ $#* 1){ bootf=$1 if(! ~ $bootf /*) bootf=`{builtin pwd}^/$bootf } 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} s=`{awk '/^sd./ && /nvme/ {print substr($1,3,1)}' <'#S/sdctl' >[2]/dev/null} # for scram, don't scram other systems bind -b '#P' /dev >[2]/dev/null # 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/test /tmp if(~ $#bootf 1){ if(! cp $bootf /tmp/bootf) exit 'failed to copy kernel' bootf=/bin/bootf } if not { mkdir /tmp/aux cp /bin/aux/acpi /tmp/aux cp /bin/scram /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 } echo echo done halting # turn off disk drives for(i in $s) echo config spec $i switch off >>'#S/sdctl' if(~ $reboot yes){ echo rebooting... echo reboot $bootf >'#c/reboot' } if not { scram echo 'It''s now safe to turn off your computer' } } x