#!/bin/bash # This control script is a modified version of the condor init script # developed by Matt Farrellee. The main differences are that it controls # the schedd instead of master, there is no lockfile, and all echo # statements have been removed. # The program being managed prog=condor_schedd pidfile=/var/run/condor/$prog.pid # Source function library . /etc/init.d/functions # Source networking configuration [ -f /etc/sysconfig/network ] && . /etc/sysconfig/network # Source Condor configuration [ -f /etc/sysconfig/condor ] && . /etc/sysconfig/condor # Check that networking is up [ "${NETWORKING}" = "no" ] && exit 1 start() { pid_status $pidfile if [ $? -ne 0 ]; then rm -f $pidfile fi daemon --pidfile $pidfile --check $prog $prog -pidfile $pidfile RETVAL=$? return $RETVAL } stop() { killproc -p $pidfile $prog -QUIT RETVAL=$? wait_pid $pidfile 15 if [ $? -ne 0 ]; then RETVAL=1 fi return $RETVAL } # # Determine if a process is running only by looking in a pidfile. # There is no use of pidof, which can find processes that are not # started by this script. # # ASSUMPTION: The pidfile will exist if the process does, see false # negative warning. # # WARNING: A false positive is possible if the process that dropped # the pid file has crashed and the pid has been recycled. A false # negative is possible if the process has not yet dropped the pidfile, # or it contains the incorrect pid. # # Usage: pid_status # Result: 0 = pid exists # 1 = pid does not exist, but pidfile does # 2 = pidfile does not exist, thus pid does not exist # 3 = status unknown # pid_status() { pid=$(get_pid $1) case $? in 1) return 2 ;; 2) return 3 ;; esac ps $pid &>/dev/null if [ $? -ne 0 ]; then return 1 fi return 0 } # # Wait for the pid in the pidfile to disappear, but only do so for at # most timeout seconds. # # Usage: wait_pid # Result: 0 = pid was not found (doesn't exist or not accessible) # 1 = pid still exists after timeout wait_pid() { pid=$(get_pid $1) if [ $? -ne 0 ]; then return 0 fi wait=0 while [ $wait -lt $2 ]; do pid_status $1 if [ $? -ne 0 ]; then return 0 fi sleep 1 wait=$((wait + 1)) done return 1 } # # Retrieve pid from a pidfile # # Usage: get_pid # Result: 0 = pid returned # 1 = pidfile not found # 2 = pidfile not accessible or didn't contain pid # Stdout: pid # get_pid() { if [ -s $1 ]; then pid=`cat $1` &>/dev/null if [ $? -ne 0 -o -z "$pid" ]; then return 2 fi echo -n $pid return 0 fi return 1 } pid_status $pidfile running=$? if [ "$1" != "status" -a "$1" != "stop" ]; then # Report that $prog does not exist, or is not executable if [ ! -x /usr/sbin/$prog ]; then exit 5 fi [ $running -eq 4 ] && exit 7 fi case "$1" in start) [ $running -eq 0 ] && exit 0 start RETVAL=$? ;; stop) [ $running -eq 0 ] || exit 0 stop RETVAL=$? ;; status) if [ $running -ne 0 ]; then exit $running fi # WARNING: status uses pidof and may find more pids than it # should. status -p $pidfile $prog RETVAL=$? ;; *) RETVAL=2 esac exit $RETVAL