Bash thực thi song song và thoát mã
Dec 31 2020
Tôi muốn chạy nhiều lệnh song song trong một tập lệnh bash, nhưng nếu bất kỳ lệnh nào trong số này không thành công (trả về mã thoát khác 0), thì mã thoát tập lệnh phải khác 0.
Tôi đã cố gắng sử dụng 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 $?
và chỉ làm nền cho quá trình:
cat >script.sh <<EOF
{sleep 2; echo 1} &
{sleep 4; exit 1; echo 2} &
{sleep 6; echo 3} &
wait
EOF
bash script.sh; echo $?
Trong cả hai trường hợp, mã thoát tổng thể luôn là 0.
Có ý kiến gì không?
Trả lời
2 KamilCuk Dec 31 2020 at 02:56
nhưng nếu bất kỳ lệnh nào trong số này không thành công (trả về mã thoát khác 0), mã thoát tập lệnh phải khác 0.
Vì vậy, hãy viết điều kiệ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
Cảm ơn mọi người vì câu trả lời của họ.
Sau Mark Setchellgợi ý, tôi nghĩ giải pháp tốt nhất cho tôi là:
#!/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