Bash การดำเนินการแบบขนานและรหัสออก

Dec 31 2020

ฉันต้องการเรียกใช้คำสั่งหลายคำสั่งพร้อมกันในสคริปต์ bash แต่ถ้าคำสั่งใด ๆ เหล่านี้ล้มเหลว (ส่งคืนรหัสออกที่ไม่ใช่ศูนย์) รหัสออกสคริปต์จะต้องไม่เป็นศูนย์

ฉันได้พยายามใช้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 $?

และเป็นเพียงพื้นหลังของกระบวนการ:

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

ในทั้งสองกรณีรหัสทางออกโดยรวมจะเป็น 0 เสมอ

ความคิดใด ๆ ?

คำตอบ

2 KamilCuk Dec 31 2020 at 02:56

แต่ถ้าคำสั่งใด ๆ เหล่านี้ล้มเหลว (ส่งคืนรหัสทางออกที่ไม่ใช่ศูนย์) รหัสออกของสคริปต์จะต้องไม่เป็นศูนย์

เลยเขียนเงื่อนไขนั้น

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

ขอบคุณทุกคนสำหรับคำตอบ

ตามMark Setchellคำแนะนำฉันคิดว่าทางออกที่ดีที่สุดสำหรับฉันคือ:

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