Не используйте kill -9
.
Вы хотите поймать в ловушку EXIT
, а не INT
.
trap 'kill $fooPid $barPid' EXIT
foo & fooPid=$!
bar & barPid=$!
wait
Это решение всегда гарантирует завершение foo
и bar
, независимо от причины выхода (исключая SIGKILL
'ed).
Если вы хотите избежать сохранения PID (что связано с некоторыми условиями гонки), вы можете сделать это вместо этого:
trap 'kill $(jobs -p)' EXIT
foo &
bar &
wait
Это лучшее (и более чистое) решение, если у вашего сценария нет других заданий.
Ps :
Эти решения означают, что foo
и bar
могут писать в ваш терминал (ваш скрипт stdout
), но ни один не может читать из stdin
. Если вам нужно foo
или bar
для чтения со стандартного ввода, решение становится на бит более сложным.