Bash esecuzione parallela e codice di uscita
Dec 31 2020
Vorrei eseguire più comandi in parallelo in uno script bash, ma se uno di questi comandi fallisce (restituisce un codice di uscita diverso da zero), il codice di uscita dello script deve essere diverso da zero.
Ho provato a usare sem
(https://www.gnu.org/software/parallel/sem.html):
cat >script.sh <<EOF
sem -j+0 "sleep 2; echo 1"
sem -j+0 "sleep 4; exit 1; echo 2"
sem -j+0 "sleep 6; echo 3"
sem --wait
EOF
bash script.sh; echo $?
e solo in background il processo:
cat >script.sh <<EOF
{sleep 2; echo 1} &
{sleep 4; exit 1; echo 2} &
{sleep 6; echo 3} &
wait
EOF
bash script.sh; echo $?
In entrambi i casi, il codice di uscita complessivo è sempre 0.
Qualche idea?
Risposte
2 KamilCuk Dec 31 2020 at 02:56
ma se uno di questi comandi fallisce (restituisce un codice di uscita diverso da zero), il codice di uscita dello script deve essere diverso da zero.
Quindi scrivi quella condizione.
childs=();
{ sleep 0.2; echo 1 ;} &
childs+=($!); { sleep 0.4; exit 1; echo 2; } & childs+=($!);
{ sleep 0.6; echo 3; } &
childs+=($!); ret=0; for i in "${childs[@]}"; do
if ! wait "$i"; then ret=1; fi done echo "ret=$ret"
exit "$ret"
2 yellowhat Dec 31 2020 at 15:23
Grazie a tutti per le loro risposte.
Seguendo il Mark Setchell
suggerimento, penso che la soluzione migliore per me sia:
#!/bin/bash
set -euo pipefail
cat <<EOF | parallel --halt 1
date; sleep 2; date; echo -e "1\n"
date; sleep 4; exit 1; date; echo -e "2\n"
date; sleep 6; date; echo -e "3\n"
EOF