]> git.sur5r.net Git - bacula/bacula/blob - bacula/scripts/bacula.in
0d7996703aed17eaf1375dc65b046cb2521b9ac8
[bacula/bacula] / bacula / scripts / bacula.in
1 #! /bin/sh
2 #
3 # bacula       This shell script takes care of starting and stopping
4 #              the bacula daemons.
5 #
6 #   This is pretty much watered down version of the RedHat script
7 #   that works on Solaris as well as Linux, but it won't work everywhere.
8 #
9 # description: It comes by night and sucks the vital essence from your computers.
10 #
11
12 PSCMD="@PSCMD@"
13
14 # All these are not *really* needed but it makes it
15 #  easier to "steal" this code for the development 
16 #  environment where they are different.
17 #  
18 BACFDBIN=@sbindir@
19 BACFDCFG=@sysconfdir@
20 BACSDBIN=@sbindir@
21 BACSDCFG=@sysconfdir@
22 BACDIRBIN=@sbindir@
23 BACDIRCFG=@sysconfdir@
24 PIDDIR=@piddir@
25 SUBSYSDIR=@subsysdir@
26
27 DIR_PORT=@dir_port@
28 FD_PORT=@fd_port@
29 SD_PORT=@sd_port@
30
31 DIR_USER=@dir_user@
32 DIR_GROUP=@dir_group@
33 FD_USER=@fd_user@
34 FD_GROUP=@fd_group@
35 SD_USER=@sd_user@
36 SD_GROUP=@sd_group@
37
38 PIDOF=@PIDOF@   
39
40 # A function to stop a program.
41 killproc() {
42     RC=0
43     # Test syntax.
44     if [ $# = 0 ]; then
45         echo "Usage: killproc {program} [signal]"
46         return 1
47     fi
48
49     notset=0
50     # check for third arg to be kill level
51     if [ "$3" != "" ] ; then
52         killlevel=$3
53     else
54         notset=1
55         killlevel="-9"
56     fi
57
58     # Get base program name
59     base=`basename $1`
60
61     # Find pid.
62     pid=`pidofproc $base $2`
63
64     # Kill it.
65     if [ "$pid" != "" ] ; then
66         if [ "$notset" = "1" ] ; then
67             if ps -p $pid>/dev/null 2>&1; then
68                 # TERM first, then KILL if not dead
69                 kill -TERM $pid 2>/dev/null
70                 sleep 1
71                 if ps -p $pid >/dev/null 2>&1 ; then
72                     sleep 1
73                     if ps -p $pid >/dev/null 2>&1 ; then
74                         sleep 3
75                         if ps -p $pid >/dev/null 2>&1 ; then
76                             kill -KILL $pid 2>/dev/null
77                         fi
78                     fi
79                 fi
80              fi
81              ps -p $pid >/dev/null 2>&1
82              RC=$?
83              [ $RC -eq 0 ] && failure "$base shutdown" || success "$base shutdown"
84         #    RC=$((! $RC))
85         # use specified level only
86         else
87             if ps -p $pid >/dev/null 2>&1; then
88                 kill $killlevel $pid 2>/dev/null
89                 RC=$?
90                 [ $RC -eq 0 ] && success "$base $killlevel" || failure "$base $killlevel"
91             fi
92         fi
93     else
94         failure "$base shutdown"
95     fi
96     # Remove pid file if any.
97     if [ "$notset" = "1" ]; then
98         rm -f ${PIDDIR}/$base.$2.pid
99     fi
100     return $RC
101 }
102
103 # A function to find the pid of a program.
104 pidofproc() {
105     pid=""
106     # Test syntax.
107     if [ $# = 0 ] ; then
108         echo "Usage: pidofproc {program}"
109         return 1
110     fi
111
112     # Get base program name
113     base=`basename $1`
114
115     # First try PID file
116     if [ -f ${PIDDIR}/$base.$2.pid ] ; then
117         pid=`head -n 1 ${PIDDIR}/$base.$2.pid`
118         if [ "$pid" != "" ] ; then
119             echo $pid
120             return 0
121         fi
122     fi
123
124     # Next try "pidof"
125    if [ -x ${PIDOF} ] ; then
126        pid=`${PIDOF} $1`
127    fi
128    if [ "$pid" != "" ] ; then
129        echo $pid
130        return 0
131    fi
132
133     # Finally try to extract it from ps
134     ${PSCMD} | grep $1 | awk '{ print $1 }' | tr '\n' ' '
135     return 0
136 }
137
138 status() {
139     # Test syntax.
140     if [ $# = 0 ] ; then
141         echo "Usage: status {program}"
142         return 1
143     fi
144
145     # Get base program name
146     base=`basename $1`
147
148    # First try "pidof"
149    if [ -x ${PIDOF} ] ; then
150        pid=`${PIDOF} $1`
151    fi
152    if [ "$pid" != "" ] ; then
153        echo "$base (pid $pid) is running..."
154        return 0
155    else
156        pid=`${PSCMD} | awk 'BEGIN { prog=ARGV[1]; ARGC=1 } 
157              { if ((prog == $2) || (("(" prog ")") == $2) ||
158                   (("[" prog "]") == $2) ||
159                   ((prog ":") == $2)) { print $1 ; exit 0 } }' $1`
160        if [ "$pid" != "" ] ; then
161            echo "$base (pid $pid) is running..."
162            return 0
163        fi
164    fi
165
166     # Next try the PID files
167     if [ -f ${PIDDIR}/$base.$2.pid ] ; then
168         pid=`head -n 1 ${PIDDIR}/$base.$2.pid`
169         if [ "$pid" != "" ] ; then
170             echo "$base dead but pid file exists"
171             return 1
172         fi
173     fi
174     # See if the subsys lock exists
175     if [ -f ${SUBSYSDIR}/$base ] ; then
176         echo "$base dead but subsys locked"
177         return 2
178     fi
179     echo "$base is stopped"
180     return 3
181 }
182
183 success() {
184   return 0
185 }
186
187 failure() {
188   rc=$?
189   return $rc
190 }
191
192 OS=`uname -s`
193
194 # if /lib/tls exists, force Bacula to use the glibc pthreads instead
195 if [ -d "/lib/tls" -a $OS = "Linux" ] ; then
196      export LD_ASSUME_KERNEL=2.4.19
197 fi
198
199 case "$1" in
200     start)
201        [ -x ${BACSDBIN}/bacula-sd ] && {
202           echo "Starting the Bacula Storage daemon"
203           OPTIONS=''
204           if [ "${SD_USER}" != '' ]; then
205              OPTIONS="${OPTIONS} -u ${SD_USER}"
206           fi
207
208           if [ "${SD_GROUP}" != '' ]; then
209              OPTIONS="${OPTIONS} -g ${SD_GROUP}"
210           fi
211
212           ${BACSDBIN}/bacula-sd $2 ${OPTIONS} -v -c ${BACSDCFG}/bacula-sd.conf
213        }
214
215        [ -x ${BACFDBIN}/bacula-fd ] && {
216           echo "Starting the Bacula File daemon"
217           OPTIONS=''
218           if [ "${FD_USER}" != '' ]; then
219              OPTIONS="${OPTIONS} -u ${FD_USER}"
220           fi
221
222           if [ "${FD_GROUP}" != '' ]; then
223              OPTIONS="${OPTIONS} -g ${FD_GROUP}"
224           fi
225
226           ${BACFDBIN}/bacula-fd $2 ${OPTIONS} -v -c ${BACFDCFG}/bacula-fd.conf
227        }
228
229        [ -x ${BACDIRBIN}/bacula-dir ] && { 
230            sleep 2
231            echo "Starting the Bacula Director daemon"
232           OPTIONS=''
233           if [ "${DIR_USER}" != '' ]; then
234              OPTIONS="${OPTIONS} -u ${DIR_USER}"
235           fi
236
237           if [ "${DIR_GROUP}" != '' ]; then
238              OPTIONS="${OPTIONS} -g ${DIR_GROUP}"
239           fi
240
241           ${BACDIRBIN}/bacula-dir $2 ${OPTIONS} -v -c ${BACDIRCFG}/bacula-dir.conf
242        }
243        ;;
244
245     stop)
246        # Stop the FD first so that SD will fail jobs and update catalog
247        [ -x ${BACFDBIN}/bacula-fd ] && {
248           echo "Stopping the Bacula File daemon"
249           killproc ${BACFDBIN}/bacula-fd ${FD_PORT}
250        }
251
252        [ -x ${BACSDBIN}/bacula-sd ] && {
253           echo "Stopping the Bacula Storage daemon"
254           killproc ${BACSDBIN}/bacula-sd ${SD_PORT}
255        }
256
257        [ -x ${BACDIRBIN}/bacula-dir ] && {
258           echo "Stopping the Bacula Director daemon"
259           killproc ${BACDIRBIN}/bacula-dir ${DIR_PORT}
260        }
261        echo
262        ;;
263
264     restart)
265        $0 stop
266        sleep 5
267        $0 start
268        ;;
269
270     status)
271        [ -x ${BACSDBIN}/bacula-sd   ] && status ${BACSDBIN}/bacula-sd  ${SD_PORT}
272        [ -x ${BACFDBIN}/bacula-fd   ] && status ${BACFDBIN}/bacula-fd  ${FD_PORT}
273        [ -x ${BACDIRBIN}/bacula-dir ] && status ${BACDIRBIN}/bacula-dir ${DIR_PORT}
274        ;;
275
276     *)
277        echo "Usage: $0 {start|stop|restart|status}"
278        exit 1
279        ;;
280 esac
281 exit 0