2 ######################################################################
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; either version 2 of the License, or
7 # (at your option) any later version.
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18 # Copyright (C) 2009 Network RADIUS SARL <info@networkradius.com>
20 ######################################################################
22 # radwatch - Start the radius daemon and restart upon crash.
24 # It also catches signals sent to it, and then re-sends those signals
25 # to the radius server it is watching.
27 # If you want to watch and re-start the server, we recommend
28 # reading the file doc/supervise-radiusd.txt
31 # This simplifies the script, and avoids most issues with (say)
32 # Debian re-naming "radiusd" to "freeradius".
37 exec_prefix=@exec_prefix@
39 localstatedir=@localstatedir@
41 rundir=${localstatedir}/run/${name}
42 sysconfdir=@sysconfdir@
43 pid_file=${rundir}/${name}.pid
44 log_file=${logdir}/${name}_safe.log
46 RADIUSD=$sbindir/${name}
47 RADDBDIR=${sysconfdir}/raddb
50 # If you want to send email, define this field to be an email address.
51 # This part of the functionality hasn't been well tested, so please
52 # test it before putting it into production.
54 # It also presumes that you have a functioning mail system on
55 # the maching running RADIUS. You will need to check that the
56 # "mail" command exists, and sends mail to the address below, e.g.:
58 # echo test | mail -s "Testing" $MAILTO
60 # If you receive the message, then enable MAILTO. Otherwise, fix
61 # your mail system so that it delivers mail.
66 # Allow "radiusd_safe -X" for testing the radiusd_safe functionality.
70 test -f $RADIUSD || exit 0
71 test -f $RADDBDIR/radiusd.conf || exit 0
76 # See if the PID file exists. It might have been left over after
77 # a crash, or it might be because the RADIUS server is still running.
83 # Check if the process exists, AND if it has the right name
85 if ps -p $PID | grep $name > /dev/null
87 echo "`date +'%a %b %e %H:%M:%S %Y'` : Fatal: A $name process already exists at PID $PID. We cannot start another one." >> $log_file
88 echo "A $name process already exists"
93 # A RADIUS server doesn't exist. Delete the stale PID file.
98 echo "`date +'%a %b %e %H:%M:%S %Y'` : Fatal: Cannot remove the pid file: $pid_file" >> $log_file
99 echo "Fatal error: Cannot remove the pid file: $pid_file"
100 echo "Please remove it manually and start $0 again"
101 echo "$name daemon not started"
111 # Loop forever, or until we're told to exit via a signal.
116 trap 'mysig=yes' HUP TERM INT QUIT TSTP
119 # The first time around, just start the server.
120 # After that, see if we are re-starting in the same second
121 # as the last time. If so, sleep for a second. Otherwise,
122 # if we're not starting in the same second, then just restart
125 # This helps prevent CPU spikes when something goes catastrophically
126 # wrong, and the server re-starts continuously. (e.g. disk full, etc.)
128 if test "$started" != "0"
130 # Send mail when the server starts
131 if test "$MAILTO" != ""
134 restarts=`expr $restarts + 1`
136 # send email the first time it restarts
137 if test "$last_email" = "0"
139 cat | mail -s "ERROR - $name died, restarting.." $MAILTO <<EOF
140 $name has restarted unexpectedly at $now
142 See $log_file for details. Last 20 lines are:
144 ----------------------------------------------------------------------
145 `tail -n 20 $log_file`
150 # Send email only once every hour.
151 if test "$now" -gt `expr $last_email + 3600`
153 cat | mail -s "ERROR - $name died, restarting.." $MAILTO <<EOF
154 $name has restarted $restarts times since last email at $last_email
156 See $log_file for details. Last 100 lines are:
158 ----------------------------------------------------------------------
159 `tail -n 100 $log_file`
167 if test "$started" = `date +"%s"`
174 eval "$RADIUSD -f $ARGS < /dev/null >> $log_file 2>&1 &"
179 echo "Failed to start $name. See $log_file for details"
180 echo "$name daemon not started"
184 echo $PID > $pid_file
187 # Wait for the process to exit.
194 echo "`date +'%a %b %e %H:%M:%S %Y'` : Info: $name exited normally. Exiting" | tee -a $log_file
199 echo "`date +'%a %b %e %H:%M:%S %Y'` : Info: $name exited unexpectedly. Restarting it." | tee -a $log_file
204 # The server exited of its own accord.
206 if test "$code" -lt 128
208 echo "`date +'%a %b %e %H:%M:%S %Y'` : Info: $name exited unexpectedly on exit code $code. Restarting it." | tee -a $log_file
210 sig=`expr $code - 128`
213 # Was the signal sent to us, or to the child process?
215 if test "$mysig" = "yes"
217 echo "`date +'%a %b %e %H:%M:%S %Y'` : Info: Caught signal $sig: Signalling $name to exit." | tee -a $log_file
218 kill -`expr $code - 128` $PID
221 echo "`date +'%a %b %e %H:%M:%S %Y'` : Info: $name exited unexpectedly on signal $sig. Restarting it." | tee -a $log_file