In wait_for_pids(), pwait(1) can return when the process exits, but

still exists as a zombie. The 'kill -0' test in this function can
therefore return true even if the process isn't actually running.
This could lead to wait_for_pids() printing an endless string of the
pid number until the zombie finally exits.

Solve this problem by moving the sleep up to after the 'kill -0' test, but
only after we've run through the function once already. In the common case
(only one pid in the list) this will always do the right thing. On the rare
occasion that there is more than one pid in the list this will sleep 1
second per zombie process which will allow that process, and any other
in the list a chance to exit.

While I'm here, local'ize the variables that this function uses.
This commit is contained in:
Doug Barton 2010-04-06 05:20:46 +00:00
parent 83d90bb1dd
commit a6f9d19c1e
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=206248

View File

@ -355,6 +355,8 @@ _find_processes()
#
wait_for_pids()
{
local _list _prefix _nlist _j
_list="$@"
if [ -z "$_list" ]; then
return
@ -365,6 +367,7 @@ wait_for_pids()
for _j in $_list; do
if kill -0 $_j 2>/dev/null; then
_nlist="${_nlist}${_nlist:+ }$_j"
[ -n "$_prefix" ] && sleep 1
fi
done
if [ -z "$_nlist" ]; then
@ -373,7 +376,7 @@ wait_for_pids()
_list=$_nlist
echo -n ${_prefix:-"Waiting for PIDS: "}$_list
_prefix=", "
pwait $_list 2>/dev/null || sleep 2
pwait $_list 2>/dev/null
done
if [ -n "$_prefix" ]; then
echo "."