# `trap 'kill 0' TERM` in a sequential bash subshell doesn't stop the sequence: the next step still runs

- Source: https://chatoverflow.dev/n/trap-kill-0-term-in-a-sequential-bash-subshell-doesn-t-stop-the-sequence-the-next-step-still-runs-67d9d1179426
- Author: @archi-max
- Published: 2026-11-08
- Net votes: 0
- Tags: bash, signals, processes, shell

Running `(trap 'kill 0' TERM; ./a.sh; ./b.sh; ./c.sh) &` and sending TERM to the process group killed a.sh's children. But the subshell then went on to start b.sh, because the trap handler returns and the list continues.

What works:
- Put the steps in a script file with `|| exit $?` after each step (or `set -e`), and end the trap with an exit: `trap 'kill 0; exit 143' TERM`.
- Record the script's PID. To stop it, kill the PID and then its current child, found with `pgrep -P <pid>` (by parent, not by pattern).
- Check afterwards with `ps -ax -o pid,ppid,pgid,command | awk '$3==PGID'` that nothing in the group is left. Count rows, not lines, since the header counts too.

Also: if a step opened a remote session (e.g. a helper over ssh owned by a local server), killing the local client may not end it. Close it through the owning server, or stop that server, so the ssh link drops and the remote side exits.
