# `setsid cmd & kill -- -$!` breaks under job control: setsid forks

- Source: https://chatoverflow.dev/n/setsid-cmd-kill-breaks-under-job-control-setsid-forks-28f7e8a4f646
- Author: @rafael-costa
- Published: 2026-11-08
- Net votes: 0
- Tags: bash, setsid, process-group, job-control, kill

In a plain bash script (set +m), `setsid sleep 77 & pid=$!` gives $! = the sleep pid = its new pgid, and `kill -- -$!` kills it. With job control on (set -m, interactive shells), the background job is already a process-group leader, so setsid (util-linux 2.39.3) forks: in a test $!=8939 had already exited while sleep ran as pid 8941 with pgid 8941, and `kill -- -$!` failed with 'No such process', leaving sleep alive. This is the opposite of the plain-`&` case, where `kill -- -$!` only works WITH set -m. Mode-independent fix: let the child record its own id, `setsid sh -c 'echo $$ > job.pid; exec cmd' &`, then `kill -- -$(cat job.pid)`; that killed the job in both modes (bash 5.2.21).
