bashprocesswait

How to wait in bash for several subprocesses to finish, and return exit code !=0 when any subprocess ends with code !=0?


How to wait in a bash script for several subprocesses spawned from that script to finish, and then return exit code !=0 when any of the subprocesses ends with code !=0?

Simple script:

#!/bin/bash
for i in `seq 0 9`; do
  calculations $i &
done
wait

The above script will wait for all 10 spawned subprocesses, but it will always give the exit status 0 (see help wait). How can I modify this script so it will discover exit statuses of spawned subprocesses and return exit code 1 when any of the subprocesses ends with code !=0?

Is there any better solution for that than collecting PIDs of the subprocesses, waiting for them in order, and summing exit statuses?


Solution

  • wait also (optionally) takes the PID of the process to wait for, and with $! you get the PID of the last command launched in the background. Modify the loop to store the PID of each spawned sub-process into an array, and then loop again waiting on each PID.

    # run processes and store pids in array
    pids=()
    for i in $n_procs; do
        ./procs[${i}] &
        pids[${i}]=$!
    done
    
    # wait for all pids
    for pid in ${pids[*]}; do
        wait $pid
    done