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