With @JithinScarla's help and this other stackoverflow post I made I put this together which seems to get the job done.
process_ids=( )
finish(){
for i in "${process_ids[@]}"; do
kill -9 $i > /dev/null 2> /dev/null || :
done
}
append() { process_ids+=( "$1" ); } # POSIX-standard function declaration syntax
{ sleep 1 && echo 'one'; } & append $!
{ sleep 5 && echo 'two'; } & append $!
{ sleep 1 && echo 'three'; } & append $!
{ sleep 5 && echo 'four'; } & append $!
echo "Background processes:" # Demonstrate that our array was populated
printf ' - %s\n' "${process_ids[@]}"
trap finish EXIT
wait
Or here even a bit cleaner:
function runParallel {
process_ids=( )
finish(){
for i in "${process_ids[@]}"; do
kill -9 $i > /dev/null 2> /dev/null || :
done
}
append() { process_ids+=( "$1" ); } # POSIX-standard function declaration syntax
processes=( "$@" )
for i in "${processes[@]}"; do
{ eval $i; } & append $!
done
trap finish EXIT
wait
}
runParallel \
"sleep 1 && echo 'one'" \
"sleep 5 && echo 'two'" \
"sleep 1 && echo 'three'" \
"sleep 5 && echo 'four'"