# functions This file contains functions to be used by most or all
# shell scripts in the /etc/init.d directory.
#
-# $Id: functions,v 1.72 2002/06/13 13:06:13 grabba Exp $
+# $Id: functions,v 1.73 2002/07/14 21:11:17 misiek Exp $
#
# Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
# Hacked by: Greg Galloway and Marc Ewing
esac
else
# check if we are on proper terminal
- tput longname > /dev/null 2>&1 /dev/null || return
+ tput longname > /dev/null 2>&1 || return
case "$1" in
hpa | cuu* | el)
termput hpa $INIT_COL
}
+# Check if $pid (could be plural) are running
+checkpid()
+{
+ while [ "$1" ]; do
+ [ -d "/proc/$1" ] && return 0
+ shift
+ done
+ return 1
+}
+
# Usage run_cmd Message command_to_run
run_cmd()
{
# And start it up.
busy
- if errors=$(HOME=/tmp TMPDIR=/tmp nice -n ${SERVICE_RUN_NICE_LEVEL:-$DEFAULT_SERVICE_RUN_NICE_LEVEL} initlog -c "$prog" 2>&1); then
+ if errors=$(USER=root HOME=/tmp TMPDIR=/tmp nice -n ${SERVICE_RUN_NICE_LEVEL:-$DEFAULT_SERVICE_RUN_NICE_LEVEL} initlog -c "$prog" 2>&1); then
log_success "$1 startup"
ok
else
# A function to stop a program.
killproc()
{
- typeset notset killlevel base pid
+ typeset notset killlevel base pid result
# Test syntax.
if [ $# = 0 ]; then
msg_usage " killproc {program} [signal]"
fi
# Save basename.
- base=$(basename $1)
+ base=$(basename "$1")
# Find pid.
- pid=$(pidofproc $base)
+ pid=$(pidofproc "$1")
+ [ -z "$pid" ] && pid=$(pidofproc "$base")
# Kill it.
if [ -n "$pid" ] ; then
if [ "$notset" = "1" ] ; then
- if ps h $pid>/dev/null 2>&1; then
- # TERM first, then KILL if not dead
- kill -TERM $pid >/dev/null 2>&1
- usleep 100000
- if ps h $pid >/dev/null 2>&1 ; then
- sleep 1
- if ps h $pid >/dev/null 2>&1 ; then
- sleep 3
- if ps h $pid >/dev/null 2>&1 ; then
- kill -KILL $pid >/dev/null 2>&1
- fi
- fi
- fi
- if (ps h $pid >/dev/null 2>&1); then
- fail
- log_failed "$1 shutdown"
- else
- ok
- log_success "$1 shutdown"
- fi
- else
- died
- log_failed "$1 shutdown"
+ if checkpid $pid 2>&1; then
+ # TERM first, then KILL if not dead
+ kill -TERM $pid
+ usleep 100000
+ if checkpid $pid && sleep 1 &&
+ checkpid $pid && sleep 3 &&
+ checkpid $pid; then
+ kill -KILL $pid
+ usleep 100000
fi
+ fi
+ checkpid $pid
+ result=$?
+ if [ "$result" -eq 0 ]; then
+ fail
+ log_failed "$1 shutdown"
+ else
+ ok
+ log_success "$1 shutdown"
+ fi
+ result=$(( ! $result ))
# use specified level only
else
- if ps h $pid >/dev/null 2>&1; then
- if (kill $killlevel $pid); then
- ok
- log_success "$1 got $killlevel"
- else
- fail
- log_failed "$1 didn't get $killlevel"
- fi
+ if checkpid $pid > /dev/null 2>&1; then
+ kill $killlevel $pid
+ result=$?
+ if [ "$result" -eq 0 ]; then
+ ok
+ log_success "$1 got $killlevel"
else
- died
- log_failed "$1 shutdown"
+ fail
+ log_failed "$1 didn't get $killlevel"
fi
+ else
+ died
+ log_failed "$1 shutdown"
+ fi
fi
else
- died
- log_failed "$1 shutdown"
+ died
+ log_failed "$1 shutdown"
+ result=1
fi
# Remove pid file if any.
if [ "$notset" = "1" ]; then
- rm -f /var/run/$base.pid
+ rm -f /var/run/${base}.pid
fi
+
+ return $result
}
# A function to find the pid of a program.
pidofproc()
{
- typeset pid
- # Test syntax.
- if [ $# = 0 ] ; then
- msg_usage " pidofproc {program}"
- return 1
- fi
+ typeset pid base
+ base=$(basename "$1")
- # First try "/var/run/*.pid" files
- if [ -f /var/run/$1.pid ] ; then
- pid=$(head -1 /var/run/$1.pid)
- if [ -n "$pid" ] ; then
- echo $pid
- return 0
- fi
+ # Test syntax.
+ if [ $# = 0 ] ; then
+ msg_usage " pidofproc {program}"
+ return 1
+ fi
+
+ # First try "/var/run/*.pid" files
+ if [ -f /var/run/${base}.pid ] ; then
+ typeset line p pid
+ pid=
+ read line < /var/run/${base}.pid
+ for p in $line; do
+ [ -z "$(echo "$p" | awk ' { gsub(/[0-9]/,""); print $0; } ' )" ] && 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 $1)
- if [ -n "$pid" ] ; then
- echo $pid
- return 0
- fi
-
- # Finally try to extract it from ps
- ps ax | awk 'BEGIN { prog=ARGV[1]; ARGC=1 }
- { if ((prog == $5) || (("(" prog ")") == $5) ||
- (("[" prog "]") == $5) ||
- ((prog ":") == $5)) { print $1 ; exit 0 } }' $1
+ pidof -o $$ -o $PPID -o %PPID -x "$1" || \
+ pidof -o $$ -o $PPID -o %PPID -x "${base}"
}
status()
{
- # Test syntax.
- if [ $# = 0 ] ; then
- msg_usage " status {subsys} [{daemon}]"
- return 1
- fi
-
- subsys=$1
- daemon=${2:-$subsys}
-
- # First try "pidof"
- pid=$(pidof -o $$ -o $PPID -o %PPID -x $daemon)
- if [ -n "$pid" ] ; then
- nls "%s (pid %s) is running..." "$daemon" "$pid"
- return 0
- else
- pid=`ps ax | awk 'BEGIN { prog=ARGV[1]; ARGC=1 }
- { if ((prog == $5) || (("(" prog ")") == $5) ||
- (("[" prog "]") == $5) ||
- ((prog ":") == $5)) { print $1 ; exit 0 } }' $1`
- if [ "$pid" != "" ] ; then
- nls "%s (pid %s) is running..." "$daemon" "$pid"
- return 0
- fi
- fi
+ typeset base pid
+ base=$(basename "$1")
- # Next try "/var/run/*.pid" files
- if [ -f /var/run/$daemon.pid ] ; then
- pid=$(head -1 /var/run/$1.pid)
- if [ -n "$pid" ] ; then
- nls "%s dead but pid file exists" "$1"
- return 1
- fi
- fi
- # See if /var/lock/subsys/$subsys exists
- if [ -f /var/lock/subsys/$subsys ]; then
- nls "%s dead but subsys locked" "$daemon"
- return 2
+ # Test syntax.
+ if [ $# = 0 ] ; then
+ msg_usage " status {subsys} [{daemon}]"
+ return 1
+ fi
+
+ # First try "pidof"
+ pid=$(pidof -o $$ -o $PPID -o %PPID -x $1 || \
+ pidof -o $$ -o $PPID -o %PPID -x ${base})
+
+ if [ "$pid" != "" ]; then
+ nls "%s (pid %s) is running..." "$base" "$pid"
+ return 0
+ fi
+
+ # Next try "/var/run/*.pid" files
+ if [ -f /var/run/${base}.pid ]; then
+ read pid < /var/run/${base}.pid
+ if [ "$pid" != "" ]; then
+ nls "%s dead but pid file exists" "$base"
+ return 1
fi
- nls "%s is stopped" "$subsys"
- return 3
+ fi
+
+ # See if /var/lock/subsys/$subsys exists
+ if [ -f /var/lock/subsys/$subsys ]; then
+ nls "%s dead but subsys locked" "$base"
+ return 2
+ fi
+ nls "%s is stopped" "$base"
+ return 3
}
# Confirm whether we really want to run this service
msg_Not_Running () { msg_not_running "$*"; }
msg_Usage () { msg_usage "$*"; }
-# This must be last line !
-# vi:syntax=sh:tw=78:ts=8:sw=4
+#/*
+# * Local variables:
+# * mode: sh
+# * indent-tabs-mode: notnil
+# * End:
+# *
+# * vim: shiftwidth=8:
+# */