aboutsummaryrefslogtreecommitdiffstats
path: root/rc.d/init.d
diff options
context:
space:
mode:
authorBill Nottingham <notting@redhat.com>2001-04-02 19:25:33 +0000
committerBill Nottingham <notting@redhat.com>2001-04-02 19:25:33 +0000
commitd33321550df172ae1f9e2b2353eea8fed9af5416 (patch)
treec6d4ba008dd914bdcc96a51128b35e37a42374f1 /rc.d/init.d
parent0c3370c7835a89b339324fea07deb4b941a0ca8b (diff)
downloadinitscripts-d33321550df172ae1f9e2b2353eea8fed9af5416.tar
initscripts-d33321550df172ae1f9e2b2353eea8fed9af5416.tar.gz
initscripts-d33321550df172ae1f9e2b2353eea8fed9af5416.tar.bz2
initscripts-d33321550df172ae1f9e2b2353eea8fed9af5416.tar.xz
initscripts-d33321550df172ae1f9e2b2353eea8fed9af5416.zip
- --background is fundamentally broken. Remove it for now.
- fix some ## substitutions to be correct - use 'su -' , not just 'su' (#26894) - make pidofproc() and killproc() try to use the PID associated with the full pathname first before killing the daemon by its basename (for daemons that share the same basename, i.e. "master" in postfix and cyrus-imapd) (#19016) - fix status() as well - return 1 in killproc if process isn't running (#26718) - various cleanups (#10761, from mjt@tls.msk.ru) - for daemon(), look only at the pid file to see if it's running (#17244, others)
Diffstat (limited to 'rc.d/init.d')
-rwxr-xr-xrc.d/init.d/functions168
1 files changed, 100 insertions, 68 deletions
diff --git a/rc.d/init.d/functions b/rc.d/init.d/functions
index ac112eb3..cf201e6f 100755
--- a/rc.d/init.d/functions
+++ b/rc.d/init.d/functions
@@ -62,42 +62,44 @@ checkpid() {
# A function to start a program.
daemon() {
# Test syntax.
- gotbase=
- user=
+ local gotbase=
+ local base= user= nice= bg= pid
nicelevel=0
- while [ "$1" != "${1##-}" -o "$1" != "${1##+}" ]; do
+ while [ "$1" != "${1##[-+]}" ]; do
case $1 in
- '') echo '$0: Usage: daemon [+/-nicelevel] {program}'
+ '') echo "$0: Usage: daemon [+/-nicelevel] {program}"
return 1;;
--check)
- shift
- base=$1
+ base=$2
gotbase="yes"
+ shift 2
+ ;;
+ --check=?*)
+ base=${1#--user=}
shift
;;
--user)
- shift
- daemon_user=$1
+ user=$2
+ shift 2
+ ;;
+ --user=?*)
+ user=${1#--user=}
shift
;;
- -*|+*) nicelevel=$1
+ [-+][0-9]*)
+ nice="nice -n $1"
shift
;;
- *) nicelevel=0
- ;;
+ *) echo "$0: Usage: daemon [+/-nicelevel] {program}"
+ return 1;;
esac
done
# Save basename.
- [ -z $gotbase ] && base=`basename $1`
+ [ -z $gotbase ] && base=${1##*/}
- # See if it's already running.
- pidlist=`pidofproc $1`
-
- pid=
- for apid in $pidlist ; do
- [ -d /proc/$apid ] && pid="$pid $apid"
- done
+ # See if it's already running. Look *only* at the pid file.
+ pidlist=`pidfileofproc $base`
[ -n "$pid" ] && return
@@ -109,11 +111,12 @@ daemon() {
[ "$BOOTUP" = "verbose" ] && echo -n " $base"
# And start it up.
- if [ -z "$daemon_user" ]; then
- nice -n $nicelevel initlog $INITLOG_ARGS -c "$*" && success "$base startup" || failure "$base startup"
+ if [ -z "$user" ]; then
+ $nice initlog $INITLOG_ARGS -c "$*"
else
- nice -n $nicelevel initlog $INITLOG_ARGS -c "su $daemon_user -c \"$*\"" && success "$base startup" || failure "$base startup"
+ $nice initlog $INITLOG_ARGS -c "su - $user -c \"$*\"" && success "$base startup" || failure "$base startup"
fi
+ [ $? = 0 ] && success "$base startup" || failure "$base startup"
}
# A function to stop a program.
@@ -135,36 +138,30 @@ killproc() {
fi
# Save basename.
- base=`basename $1`
+ base=${1##*/}
# Find pid.
- pidlist=`pidofproc $1`
-
- pid=
- for apid in $pidlist ; do
- [ -d /proc/$apid ] && pid="$pid $apid"
- done
+ pid=`pidofproc $1`
+ if [ -z "$pid" ] ; then
+ pid=`pidofproc $base`
+ fi
# Kill it.
- if [ "$pid" != "" ] ; then
+ if [ -n "$pid" ] ; then
[ $BOOTUP = "verbose" ] && echo -n "$base "
if [ "$notset" = "1" ] ; then
if checkpid $pid 2>&1; then
# TERM first, then KILL if not dead
kill -TERM $pid
usleep 100000
- if checkpid $pid >/dev/null 2>&1 ; then
- sleep 1
- if checkpid $pid >/dev/null 2>&1 ; then
- sleep 3
- if checkpid $pid >/dev/null 2>&1 ; then
- kill -KILL $pid
- usleep 100000
- fi
- fi
+ if checkpid $pid && sleep 1 &&
+ checkpid $pid && sleep 3 &&
+ checkpid $pid ; then
+ kill -KILL $pid
+ usleep 100000
fi
fi
- checkpid $pid >/dev/null 2>&1
+ checkpid $pid
RC=$?
[ $RC -eq 0 ] && failure "$base shutdown" || success "$base shutdown"
RC=$((! $RC))
@@ -178,6 +175,7 @@ killproc() {
fi
else
failure "$base shutdown"
+ RC=1
fi
# Remove pid file if any.
@@ -187,9 +185,33 @@ killproc() {
return $RC
}
+# A function to find the pid of a program. Looks *only* at the pidfile
+pidfileofproc() {
+ local base=${1##*/}
+ local pid
+
+ # Test syntax.
+ if [ $# = 0 ] ; then
+ echo "Usage: pidfileofproc {program}"
+ return 1
+ fi
+
+ # First try "/var/run/*.pid" files
+ if [ -f /var/run/${base}.pid ] ; then
+ read pid < /var/run/${base}.pid
+ for p in $line ; do
+ [ -z "${p//[0-9]/}" -a -d /proc/$p ] && pid="$pid $p"
+ done
+ if [ -n "$pid" ] ; then
+ echo $pid
+ return 0
+ fi
+ fi
+}
+
# A function to find the pid of a program.
pidofproc() {
- base=`basename $1`
+ base=${1##*/}
# Test syntax.
if [ $# = 0 ] ; then
@@ -199,23 +221,25 @@ pidofproc() {
# First try "/var/run/*.pid" files
if [ -f /var/run/${base}.pid ] ; then
- pid=`cat /var/run/${base}.pid | { read foo ; echo $foo ; }`
- if [ "$pid" != "" ] ; then
+ local line p pid=
+ read line < /var/run/${base}.pid
+ for p in $line ; do
+ [ -z "${p//[0-9]/}" -a -d /proc/$p ] && pid="$pid $p"
+ done
+ if [ -n "$pid" ] ; then
echo $pid
return 0
fi
fi
# Next try "pidof"
- pid=`pidof -o $$ -o $PPID -o %PPID -x ${base}`
- if [ "$pid" != "" ] ; then
- echo $pid
- return 0
- fi
+ pidof -o $$ -o $PPID -o %PPID -x $1 || \
+ pidof -o $$ -o $PPID -o %PPID -x ${base}
}
status() {
- base=`basename $1`
+ local base=${1##*/}
+ local pid
# Test syntax.
if [ $# = 0 ] ; then
@@ -224,7 +248,8 @@ status() {
fi
# First try "pidof"
- pid=`pidof -o $$ -o $PPID -o %PPID -x ${base}`
+ pid=`pidof -o $$ -o $PPID -o %PPID -x $1 || \
+ pidof -o $$ -o $PPID -o %PPID -x ${base}`
if [ "$pid" != "" ] ; then
echo "${base} (pid $pid) is running..."
return 0
@@ -232,7 +257,7 @@ status() {
# Next try "/var/run/*.pid" files
if [ -f /var/run/${base}.pid ] ; then
- pid=`cat /var/run/${base}.pid | { read foo ; echo $foo ; }`
+ read pid < /var/run/${base}.pid
if [ "$pid" != "" ] ; then
echo "${base} dead but pid file exists"
return 1
@@ -333,23 +358,30 @@ action() {
return $rc
}
+# returns OK if $1 contains $2
+strstr() {
+ [ "$1" = "$2" ] && return 0
+ slice=${1#*$2*}
+ [ "$slice" = "$1" ] && return 1
+ return 0
+}
+
+
# Confirm whether we really want to run this service
confirm() {
- echo -n "Start service $1 (Y)es/(N)o/(C)ontinue? [Y] "
- read answer
- case $answer in
- y|Y|"")
- return 0
- ;;
- c|C)
- return 2
- ;;
- n|N)
- return 1
- ;;
- *)
- confirm $1
- return $?
- ;;
- esac
+ local YES="yY"
+ local NO="nN"
+ local CONT="cC"
+
+ while : ; do
+ echo -n "Start service $1 (Y)es/(N)o/(C)ontinue? [Y] "
+ read answer
+ if strstr "$YES" "$answer" || [ "$answer" = "" ] ; then
+ return 0
+ elif strstr "$CONT" "$answer" ; then
+ return 2
+ elif strstr "$NO" "$answer" ; then
+ return 1
+ fi
+ done
}