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
Donovan, Şarkılarından 1'ini The Beatles'ın "Lucy in the Sky with Diamonds" şarkısıyla karşılaştırdı
Kevin Jonas'ın Kızı Alena, Doğum Günü Fotoğrafında Büyümüş Görünüyor: '9 Yaşında Gerçek Hissetmiyor'
Charly Reynolds Yakın Zamandaki Vokal Kord Ameliyatını Açıkladı: 'Şarkı Söylemekte Sorun Yaşıyordum'