1a06e2ab3SBen Gras#!/bin/sh 2*325ce30bSDavid van Moolenbroek# 3*325ce30bSDavid van Moolenbroek# $NetBSD: rc.shutdown,v 1.9 2012/06/25 07:22:45 jnemeth Exp $ 4*325ce30bSDavid van Moolenbroek# 5*325ce30bSDavid van Moolenbroek# rc.shutdown -- 6*325ce30bSDavid van Moolenbroek# Run the scripts in /etc/rc.d with reverse rcorder. 7a06e2ab3SBen Gras 8*325ce30bSDavid van Moolenbroek# System shutdown script run by shutdown(8) at system shutdown time. 9*325ce30bSDavid van Moolenbroek# Note that halt(8) and reboot(8) do NOT invoke this script. 10*325ce30bSDavid van Moolenbroek 11*325ce30bSDavid van Moolenbroekexport HOME=/ 12*325ce30bSDavid van Moolenbroekexport PATH=/sbin:/bin:/usr/sbin:/usr/bin 13*325ce30bSDavid van Moolenbroek 14*325ce30bSDavid van Moolenbroek. /etc/rc.subr 15*325ce30bSDavid van Moolenbroek. /etc/rc.conf 16*325ce30bSDavid van Moolenbroek 17*325ce30bSDavid van Moolenbroekif ! checkyesno do_rcshutdown; then 18*325ce30bSDavid van Moolenbroek echo "Skipping shutdown hooks." 19*325ce30bSDavid van Moolenbroek exit 0 20*325ce30bSDavid van Moolenbroekfi 21*325ce30bSDavid van Moolenbroek 22*325ce30bSDavid van Moolenbroekstty status '^T' 23*325ce30bSDavid van Moolenbroek 24*325ce30bSDavid van Moolenbroek# Set shell to ignore SIGINT, but not children; 25*325ce30bSDavid van Moolenbroek# shell catches SIGQUIT and returns to single user. 26*325ce30bSDavid van Moolenbroek# 27*325ce30bSDavid van Moolenbroektrap : INT 28*325ce30bSDavid van Moolenbroektrap "echo 'Shutdown interrupted.'; exit 1" QUIT 29*325ce30bSDavid van Moolenbroek 30*325ce30bSDavid van Moolenbroek# If requested, start a watchdog timer in the background which 31*325ce30bSDavid van Moolenbroek# will terminate rc.shutdown if rc.shutdown doesn't complete 32*325ce30bSDavid van Moolenbroek# within the specified time. 33*325ce30bSDavid van Moolenbroek# 34*325ce30bSDavid van Moolenbroek_rcshutdown_watchdog= 35*325ce30bSDavid van Moolenbroekif [ -n "$rcshutdown_timeout" ]; then 36*325ce30bSDavid van Moolenbroek sleep $rcshutdown_timeout && ( 37*325ce30bSDavid van Moolenbroek _msg="$rcshutdown_timeout second watchdog timeout expired. Shutdown terminated." 38*325ce30bSDavid van Moolenbroek logger -t rc.shutdown "$_msg" 39*325ce30bSDavid van Moolenbroek echo "$_msg" 40*325ce30bSDavid van Moolenbroek date 41*325ce30bSDavid van Moolenbroek kill -KILL $$ >/dev/null 2>&1 42*325ce30bSDavid van Moolenbroek ) & 43*325ce30bSDavid van Moolenbroek _rcshutdown_watchdog=$! 44*325ce30bSDavid van Moolenbroekfi 45*325ce30bSDavid van Moolenbroek 46*325ce30bSDavid van Moolenbroek 47*325ce30bSDavid van Moolenbroek# Determine the shutdown order of the rc.d scripts, 48*325ce30bSDavid van Moolenbroek# and perform the operation 49*325ce30bSDavid van Moolenbroek# 50*325ce30bSDavid van Moolenbroekscripts=$(for rcd in ${rc_directories:-/etc/rc.d}; do 51*325ce30bSDavid van Moolenbroek test -d ${rcd} && echo ${rcd}/*; done) 52*325ce30bSDavid van Moolenbroekfiles=$(rcorder -k shutdown ${rcshutdown_rcorder_flags} ${scripts}) 53*325ce30bSDavid van Moolenbroek 54*325ce30bSDavid van Moolenbroekfor _rc_elem in $(reverse_list $files); do 55*325ce30bSDavid van Moolenbroek run_rc_script $_rc_elem stop 56*325ce30bSDavid van Moolenbroekdone 57*325ce30bSDavid van Moolenbroek 58*325ce30bSDavid van Moolenbroek 59*325ce30bSDavid van Moolenbroek# Terminate the background watchdog timer (if it is running) 60*325ce30bSDavid van Moolenbroek# 61*325ce30bSDavid van Moolenbroekif [ -n "$_rcshutdown_watchdog" ]; then 62*325ce30bSDavid van Moolenbroek kill -TERM $_rcshutdown_watchdog >/dev/null 2>&1 63*325ce30bSDavid van Moolenbroekfi 64*325ce30bSDavid van Moolenbroek 65*325ce30bSDavid van Moolenbroekdate 66*325ce30bSDavid van Moolenbroekexit 0 67