Eksekusi paralel Bash dan kode keluar

Dec 31 2020

Saya ingin menjalankan beberapa perintah secara paralel dalam skrip bash, tetapi jika salah satu dari perintah ini gagal (mengembalikan kode keluar bukan nol), kode keluar skrip harus bukan nol.

Saya telah mencoba menggunakan 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 $?

dan hanya latar belakang prosesnya:

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

Dalam kedua kasus tersebut, kode keluar keseluruhan selalu 0.

Ada ide?

Jawaban

2 KamilCuk Dec 31 2020 at 02:56

tetapi jika salah satu dari perintah ini gagal (mengembalikan kode keluar bukan nol), kode keluar skrip harus bukan nol.

Jadi tulislah kondisi itu.

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

Terima kasih semuanya atas jawaban mereka.

Berikut Mark Setchellsaran, saya pikir solusi terbaik bagi saya adalah:

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