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.
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With