On 01/03/2026 22:18, Oğuz wrote:
On Monday, March 2, 2026, Ben Ashton <[email protected] <mailto:[email protected]>>
wrote:
As you can see, bash is the only one that translates $! to the PGID
of the subshell.
I don't think that is what's going on here. It looks more like bash
turns off job control in the subshell and includes `setsid sleep 5 &' in
the subshell's process group, which makes sense.
--
Oğuz
That IS what's going on. Setsid makes sleep the leader of a new process
group.
Runing this script:
#!/usr/bin/env bash
set -m
(
setsid sleep 40 &
pid=$!
echo "Sleep pid: $pid"
sleep 20
kill -TERM -$pid
echo "Here"
)
With "strace -f -e 'trace=kill' ./script.sh", gives the following output
(edited for brevity + comments)
strace: Process 17584 attached <- Subshell
strace: Process 17585 attached <- Sleep 40 (after setsid + execvp)
Sleep pid: 17585 <- sleep PID is the same as its PGID (see below)
strace: Process 17586 attached <- Sleep 20 (delay before kill)
[pid 17586] +++ exited with 0 +++ <- Sleep 20 exits
[pid 17584] --- SIGCHLD {si_pid=17586} --- <- Subshell receives CHLD
[pid 17584] kill(-17584, SIGTERM) = 0 <- Kill translates -17585
to -17584
[pid 17584] --- SIGTERM {si_pid=17584} --- <- Subshell receives TERM
from itself
[pid 17584] +++ killed by SIGTERM +++
Terminated
Before the kill command is run, here is the process tree:
PID PGID
17581 17581 | \_ strace -f -e trace=kill ./script.sh
17583 17581 | \_ bash ./script.sh
17584 17584 | \_ bash ./script.sh
17585 17585 | \_ sleep 40
17586 17584 | \_ sleep 20