Вы можете написать вокруг них сценарий-оболочку, который отправляет их все на задний план, а затем перехватывает Ctrl+C:
#!/bin/bash
trap ctrl_c INT
scripts=(./script1.sh./script2.sh./script3.sh )
ctrl_c () {
printf 'Found [%i] PIDs running\n' "${#pids[@]}"
for pid in "${pids[@]}"; do
printf 'Killing PID: %i\n' "$pid"
kill "$pid"
done
}
for script in "${scripts[@]}"; do
"$script" &
pids+=($!)
done
for pid in "${pids[@]}"; do
wait "$pid"
done
Таким образом, если вы нажмете ctrl+c, все pids, которые были захвачены ранее, будут уничтожены:
$ cat./script{1..3}.sh
#!/bin/bash
sleep 30; echo foo
#!/bin/bash
sleep 30; echo bar
#!/bin/bash
sleep 30; echo baz
$./script4.sh
^CFound [3] PIDs running
Killing PID: 48971
Killing PID: 48972
Killing PID: 48973
./script4.sh: line 21: 48971 Terminated: 15 "$script"
./script4.sh: line 21: 48972 Terminated: 15 "$script"
./script4.sh: line 21: 48973 Terminated: 15 "$script"