Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Run multiple commands in parallel, and return whenever one of them fails or all of them succeed

I've seen the following question : Bash run two commands and get output from both which almost responds to my need.

However, the wait command is blocking, so that means that if command 2 fails before command 1 succeeds, the command will not return when command 2 fails but only when command 1 succeeds.

Is it possible to run multiple commands in parallel, and return 1 whenever one of them fails and return 0 if all of them succeed (And returning as soon as possible) ?

It would be even better if that is possible using standard commands (like xargs or parallel), but also ok if it is written using bash.

like image 751
edi9999 Avatar asked Oct 31 '22 20:10

edi9999


1 Answers

This code gives the right exit code, and kills the survivor process:

#/bin/bash

# trap for SIGTERM and set RET_VALUE to false
trap "RET_VAL=false" SIGTERM

MY_PID=$$
# Initialize RET_VALUE to true
RET_VAL=true

# This function will executed be in a separate job (see below)
thread_listener() {
    # Starts the long time job 
    ./longJob.sh &
    PID=$!
    # trap for sigterm and kill the long time process
    trap "kill $PID" SIGTERM
    echo waiting for $PID
    echo Parent $MY_PID
    # Send a SIGTERM to parent job in case of failure
    wait $PID || kill $MY_PID
    exit
}

echo $MY_PID

# Runs thread listener in a separate job
thread_listener &
PID1=$!

# Runs thread listener in a separate job
thread_listener &
PID2=$!

wait
# send sigterm to PID1 and PID2 if present
kill $PID1 2> /dev/null
kill $PID2 2> /dev/null
# returns RET_VALUE
$RET_VAL

See the comments for an explanation of the code. The trick is to starts jobs able to accept or send signal to parent job if needed.

The child job send a signal to the parent in case of a failure of its long time job and the parent send a signal to its childs after the wait (it the parent receive a signal the wait returns immediatly)

like image 163
Alepac Avatar answered Nov 15 '22 07:11

Alepac