Paralel yürütme ve çıkış kodunu bas

Dec 31 2020

Bir bash betiğinde birden çok komutu paralel olarak çalıştırmak istiyorum, ancak bu komutlardan herhangi biri başarısız olursa (sıfırdan farklı bir çıkış kodu döndürürse), betik çıkış kodu sıfırdan farklı olmalıdır.

Kullanmayı denedim 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 $?

ve sadece sürecin arka planını:

cat >script.sh <<EOF
{sleep 2; echo 1} &
{sleep 4; exit 1; echo 2} &
{sleep 6; echo 3} &
wait
EOF
bash script.sh; echo $?

Her iki durumda da, genel çıkış kodu her zaman 0'dır.

Herhangi bir fikir?

Yanıtlar

2 KamilCuk Dec 31 2020 at 02:56

ancak bu komutlardan herhangi biri başarısız olursa (sıfır olmayan bir çıkış kodu döndürürse), komut dosyası çıkış kodu sıfırdan farklı olmalıdır.

Öyleyse bu koşulu yazın.

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

Cevapları için herkese teşekkürler.

Mark SetchellÖnerinin ardından , bence benim için en iyi çözüm:

#!/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