On 01/03/2026 01:38, Martin D Kealey wrote:

On Sat, 28 Feb 2026, 17:30 Ben Ashton, <[email protected]> wrote:

    …
    We now have sleep running as a child of the subshell as a process
    group leader.


    However in certain, somewhat contrived, circumstances, bash's
    builtin kill
    will send the signal to the WRONG process group.

         > Sending SIGTERM to process group: 5710 (kill -TERM -5710)
         [pid  5709] kill(-5709, SIGTERM)        = 0

    As you can see we ran `kill -TERM -5710`, but bash actually sent
    it to process group 5709 (the subshell itself). If you don't use the
    builtin kill then it works as expected
    …
    Here is the script to reproduce the issue:



           setsid sleep 10 &
           pid=$!
           echo "> Started new process group $pid"

    …

         echo "> Sending SIGTERM to process group: $pid (kill -TERM
    -$pid)"
           kill -TERM -$pid


This is the core error: $! records a PID, NOT a PGID or a SID. On some systems (e.g. Linux) a PGID or SID is always numerically equal to the PID of the leader process, on others (e.g. BSD) they are unequal.

So what would you expect to happen if you go «kill -INT -$pid» on a systems where pgrps and their respective leader pids are not identical? Would you want it to translate the PID to its pgrps, or would you prefer it to fail?

If it's going to do translations on BSD, why should it NOT do so on Linux?

-Martin

I think you misunderstand the issue. It doesn't matter how I obtain the PGID. The issue is that I'm running "kill -TERM -SOME_PGID" and the syscall bash is making is "kill(-DIFFERENT_PGID, SIGTERM)". That's objectively wrong. I don't expect any translation, I just expect it to kill the process group that I tell it to.

It's unrelated, but I'm curious what systems don't make the PGID the same as the PID of the leader? I thought that was a POSIX thing. The FreeBSD syscall manual for "setsid" states: "the setsid() system call returns the value of the process group ID of the new process group, which is the same  as the  process  ID of the calling process." https://man.freebsd.org/cgi/man.cgi?query=setsid&apropos=0&sektion=2&manpath=FreeBSD+16.0-CURRENT&format=html

Reply via email to