rc.subr: Fix premature return from wait_for_pids

Use pwait's new -r option to wait until the target processes have not
only terminated, but also been reaped.

PR:		293183
MFC after:	1 week
Sponsored by:	Klara, Inc.
Sponsored by:	NetApp, Inc.
Reviewed by:	markj
Differential Revision:	https://reviews.freebsd.org/D58391
This commit is contained in:
Dag-Erling Smørgrav committed 2026-07-27 12:15:47 +02:00
1 parent e115066370
commit 356d0b79cf
3 files changed
+20 -16

No files matched your search

+12
View File
@@ -27,6 +27,18 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 16.x IS SLOW:
world, or to merely disable the most expensive debugging functionality
at runtime, run "ln -s 'abort:false,junk:false' /etc/malloc.conf".)
20260722:
The wait_for_pids() function in rc.subr, used by rc scripts
when stopping or restarting a service, has been modified to
use pwait(1)'s new -r option, which requires kernel support.
When upgrading across this change, you should install a new
kernel first, then reboot, then install a new world, run
etcupdate, and reboot again. Otherwise, you may find that
rc.subr is unable to stop services because the running kernel
does not provide the support that the updated pwait(1) needs.
Alternatively, if you deem it safe, you may use fastboot(8) to
reboot without shutting down services first.
20260620:
On powerpc64le, long double is now IEEE 754 binary128 (quad
precision, 113-bit mantissa) instead of 64-bit double. This is an
+2 -2
View File
@@ -803,7 +803,7 @@ sort_lite()
#
wait_for_pids()
{
local _list _prefix _j
local _list= _prefix= _j=
for _j in "$@"; do
if kill -0 $_j 2>/dev/null; then
@@ -814,7 +814,7 @@ wait_for_pids()
while [ -n "$_list" ]; do
echo -n ${_prefix:-"Waiting for PIDS: "}$_list
_prefix=", "
_list=$(pwait -op $_list 2>/dev/null)
_list=$(pwait -opr $_list 2>/dev/null)
done
if [ -n "$_prefix" ]; then
echo "."
+6 -14
View File
@@ -123,20 +123,12 @@ wait_for_pids_progress_head()
}
wait_for_pids_progress_body()
{
cat >>script <<'EOF'
. /etc/rc.subr
sleep 15 &
a=$!
sleep 10 &
b=$!
sleep 5 &
c=$!
wait_for_pids $a $b $c
EOF
re="^Waiting for PIDS: [0-9]+ [0-9]+ [0-9]+"
re="${re}, [0-9]+ [0-9]+"
re="${re}, [0-9]+\.$"
atf_check -s exit:0 -o match:"${re}" /bin/sh script
a=$(sleep 4 >/dev/null & echo $!)
b=$(sleep 3 >/dev/null & echo $!)
c=$(sleep 2 >/dev/null & echo $!)
atf_check \
-o inline:"Waiting for PIDS: $a $b $c, $a $b, $a.\n" \
/bin/sh -c ". /etc/rc.subr; wait_for_pids $a $b $c"
}
atf_init_test_cases()