Exécution parallèle Bash et code de sortie
Dec 31 2020
Je voudrais exécuter plusieurs commandes en parallèle dans un script bash, mais si l'une de ces commandes échoue (renvoie un code de sortie différent de zéro), le code de sortie du script doit être différent de zéro.
J'ai essayé d'utiliser 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 $?
et juste en arrière-plan le processus:
cat >script.sh <<EOF
{sleep 2; echo 1} &
{sleep 4; exit 1; echo 2} &
{sleep 6; echo 3} &
wait
EOF
bash script.sh; echo $?
Dans les deux cas, le code de sortie global est toujours 0.
Des idées?
Réponses
2 KamilCuk Dec 31 2020 at 02:56
mais si l'une de ces commandes échoue (renvoie un code de sortie différent de zéro), le code de sortie du script doit être différent de zéro.
Alors écrivez cette condition.
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
Merci à tous pour leurs réponses.
Suite à la Mark Setchell
suggestion, je pense que la meilleure solution pour moi est:
#!/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