Execução paralela do Bash e código de saída
Dec 31 2020
Gostaria de executar vários comandos em paralelo em um script bash, mas se algum desses comandos falhar (retornar um código de saída diferente de zero), o código de saída do script deve ser diferente de zero.
Eu tentei usar 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 $?
e apenas em segundo plano o processo:
cat >script.sh <<EOF
{sleep 2; echo 1} &
{sleep 4; exit 1; echo 2} &
{sleep 6; echo 3} &
wait
EOF
bash script.sh; echo $?
Em ambos os casos, o código de saída geral é sempre 0.
Alguma ideia?
Respostas
2 KamilCuk Dec 31 2020 at 02:56
mas se algum desses comandos falhar (retorna um código de saída diferente de zero), o código de saída do script deve ser diferente de zero.
Então escreva essa condição.
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
Obrigado a todos por suas respostas.
Seguindo a Mark Setchell
sugestão, acho que a melhor solução para mim é:
#!/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
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?
Christopher Nolan uma vez se arrependeu de ter lido o 'roteiro de Pulp Fiction' de Quentin Tarantino