]> git.sur5r.net Git - bacula/bacula/blob - bacula/scripts/bacula.in
bfcafbbd9d9ba6e15aa2405920e94fc8d27f5fd5
[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 -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 -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 case "$1" in
191     start)
192        [ -x ${BACSDBIN}/bacula-sd ] && {
193           echo "Starting the Bacula Storage daemon"
194           OPTIONS=''
195           if [ "${SD_USER}" != '' ]; then
196              OPTIONS="${OPTIONS} -u ${SD_USER}"
197           fi
198
199           if [ "${SD_GROUP}" != '' ]; then
200              OPTIONS="${OPTIONS} -g ${SD_GROUP}"
201           fi
202
203           ${BACSDBIN}/bacula-sd $2 ${OPTIONS} -v -c ${BACSDCFG}/bacula-sd.conf
204        }
205
206        [ -x ${BACFDBIN}/bacula-fd ] && {
207           echo "Starting the Bacula File daemon"
208           OPTIONS=''
209           if [ "${FD_USER}" != '' ]; then
210              OPTIONS="${OPTIONS} -u ${FD_USER}"
211           fi
212
213           if [ "${FD_GROUP}" != '' ]; then
214              OPTIONS="${OPTIONS} -g ${FD_GROUP}"
215           fi
216
217           ${BACFDBIN}/bacula-fd $2 ${OPTIONS} -v -c ${BACFDCFG}/bacula-fd.conf
218        }
219
220        [ -x ${BACDIRBIN}/bacula-dir ] && { 
221            sleep 2
222            echo "Starting the Bacula Director daemon"
223           OPTIONS=''
224           if [ "${DIR_USER}" != '' ]; then
225              OPTIONS="${OPTIONS} -u ${DIR_USER}"
226           fi
227
228           if [ "${DIR_GROUP}" != '' ]; then
229              OPTIONS="${OPTIONS} -g ${DIR_GROUP}"
230           fi
231
232           ${BACDIRBIN}/bacula-dir $2 ${OPTIONS} -v -c ${BACDIRCFG}/bacula-dir.conf
233        }
234        ;;
235
236     stop)
237        # Stop the FD first so that SD will fail jobs and update catalog
238        [ -x ${BACFDBIN}/bacula-fd ] && {
239           echo "Stopping the Bacula File daemon"
240           killproc ${BACFDBIN}/bacula-fd ${FD_PORT}
241        }
242
243        [ -x ${BACSDBIN}/bacula-sd ] && {
244           echo "Stopping the Bacula Storage daemon"
245           killproc ${BACSDBIN}/bacula-sd ${SD_PORT}
246        }
247
248        [ -x ${BACDIRBIN}/bacula-dir ] && {
249           echo "Stopping the Bacula Director daemon"
250           killproc ${BACDIRBIN}/bacula-dir ${DIR_PORT}
251        }
252        echo
253        ;;
254
255     restart)
256        $0 stop
257        sleep 5
258        $0 start
259        ;;
260
261     status)
262        [ -x ${BACSDBIN}/bacula-sd   ] && status ${BACSDBIN}/bacula-sd  ${SD_PORT}
263        [ -x ${BACFDBIN}/bacula-fd   ] && status ${BACFDBIN}/bacula-fd  ${FD_PORT}
264        [ -x ${BACDIRBIN}/bacula-dir ] && status ${BACDIRBIN}/bacula-dir ${DIR_PORT}
265        ;;
266
267     *)
268        echo "Usage: $0 {start|stop|restart|status}"
269        exit 1
270        ;;
271 esac
272 exit 0