* provide wait_for_pids(), which spins until all the given pids don't exist
* run_rc_command(): - add support for "poll", which by default, uses wait_for_pids() on the list of matching processes - in the "restart" case, call "poll" between "stop" and "start" this fixes the situation where certain services (e.g, amd, squid) would take a bit longer to shutdown after receiving the kill signal to shutdown, and "/etc/rc.d/foo restart" would fail in the `start' phase.
This commit is contained in:
parent
1bf3f87777
commit
8490f0b0c0
53
etc/rc.subr
53
etc/rc.subr
@ -1,4 +1,4 @@
|
||||
# $NetBSD: rc.subr,v 1.32 2001/04/06 06:48:35 lukem Exp $
|
||||
# $NetBSD: rc.subr,v 1.33 2001/04/18 01:31:40 lukem Exp $
|
||||
#
|
||||
# Copyright (c) 1997-2000 The NetBSD Foundation, Inc.
|
||||
# All rights reserved.
|
||||
@ -157,10 +157,39 @@ check_process()
|
||||
done
|
||||
}
|
||||
|
||||
#
|
||||
# wait_for_pids pid [pid ...]
|
||||
# spins until none of the pids exist or loop finally terminates
|
||||
# (~ 65 seconds)
|
||||
#
|
||||
wait_for_pids()
|
||||
{
|
||||
_list=$*
|
||||
if [ -z "$_list" ]; then
|
||||
return
|
||||
fi
|
||||
echo -n "Waiting for PIDs: $_list"
|
||||
for _i in 1 1 1 1 2 2 2 3 3 4 5 6 7 8 9 10; do
|
||||
_nlist="";
|
||||
for _j in $_list; do
|
||||
if kill -0 $_j 2>/dev/null; then
|
||||
_nlist="${_nlist}${_nlist:+ }$_j"
|
||||
fi
|
||||
done
|
||||
if [ -z "$_nlist" ]; then
|
||||
break
|
||||
fi
|
||||
_list=$_nlist
|
||||
sleep $_i
|
||||
echo -n ", $_list"
|
||||
done
|
||||
echo "."
|
||||
}
|
||||
|
||||
#
|
||||
# run_rc_command arg
|
||||
# Search for arg in the list of supported commands, which is:
|
||||
# "start stop restart rcvar status ${extra_commands}"
|
||||
# "start stop restart rcvar status poll ${extra_commands}"
|
||||
# If there's a match, run ${arg}_cmd or the default command (see below).
|
||||
#
|
||||
# If arg has a given prefix, then change the operation as follows:
|
||||
@ -235,8 +264,6 @@ check_process()
|
||||
#
|
||||
# arg default
|
||||
# --- -------
|
||||
# status Show if ${command} is running, etc.
|
||||
#
|
||||
# start if !running && checkyesno ${rcvar}
|
||||
# ${command}
|
||||
#
|
||||
@ -251,6 +278,13 @@ check_process()
|
||||
#
|
||||
# restart Run `stop' then `start'.
|
||||
#
|
||||
# status Show if ${command} is running, etc.
|
||||
#
|
||||
# poll Wait for ${command} to exit.
|
||||
#
|
||||
# rcvar Display what rc.conf variable is used (if any).
|
||||
#
|
||||
#
|
||||
#
|
||||
run_rc_command()
|
||||
{
|
||||
@ -284,7 +318,7 @@ run_rc_command()
|
||||
_pidcmd='_pid=`check_process '$command'`'
|
||||
fi
|
||||
if [ -n "$_pidcmd" ]; then
|
||||
_keywords="${_keywords} status"
|
||||
_keywords="${_keywords} status poll"
|
||||
fi
|
||||
fi
|
||||
|
||||
@ -462,12 +496,19 @@ ${_user:+\"'}"
|
||||
return 0
|
||||
fi
|
||||
_rc_restart_done=YES
|
||||
|
||||
( $0 ${_rc_force_run:+force}stop )
|
||||
sleep 1
|
||||
( $0 ${_rc_force_run:+force}poll )
|
||||
$0 ${_rc_force_run:+force}start
|
||||
|
||||
;;
|
||||
|
||||
poll)
|
||||
if [ -n "$_pid" ]; then
|
||||
wait_for_pids $_pid
|
||||
fi
|
||||
;;
|
||||
|
||||
rcvar)
|
||||
echo "# $name"
|
||||
if [ -n "$rcvar" ]; then
|
||||
|
Loading…
x
Reference in New Issue
Block a user