Executa subshells em paralelo e coleta códigos de saída

2

Eu tenho o seguinte, achei que ele executou os subshells em paralelo, mas na verdade parece executá-los em série e não consigo entender por quê:

#!/usr/bin/env bash

set -e;
set -m # allow for job control


EXIT_CODE=0;  # exit code of overall script

function handleJobs() {
     for job in 'jobs -p'; do
         echo "PID => ${job}"
         CODE=0;
         wait ${job} || CODE=$?
         if [[ "${CODE}" != "0" ]]; then
            echo "At least one process failed with exit code => ${CODE}" ;
            EXIT_CODE=1;
         fi
     done
}

trap 'handleJobs' CHLD


for file in "$HOME/mongodump_dev/cdt_db/"* ; do

  file="$(basename "$file")"

  if [[ "$file" != "system"* && "$file" != "locks"* ]]; then

    mongorestore \
        --db "cdt_dev" \
        --collection "${file%.*}" \
        --host "<my-host>" \
        "$HOME/mongodump_dev/cdt_db/$file"  &

  fi;

done


wait;
echo "exit code => $EXIT_CODE"
exit "$EXIT_CODE"

Alguém sabe por que as subshells estão sendo executadas em série?

Eu tentei fazer isso em vez disso:

(
        mongorestore \
            --db "cdt_dev" \
            --collection "${file%.*}" \
            --host "<my-host>" \
            "$HOME/mongodump_dev/cdt_db/$file"  &

) &

agora eles são executados em paralelo, mas agora todo o script nunca será encerrado e temo que, na verdade, não esteja capturando com precisão o código de saída.

    
por Alexander Mills 21.02.2018 / 20:57

1 resposta

2

Você tem vários "problemas" com o seu script como está escrito. O que fiz foi copiar o script e, para fins de teste e avaliação, simplificá-lo fazendo como substituir o mongorestore por sleep 9999 e inserindo echo da mensagem de rastreio anexada a um arquivo de log. O longo e curto é que não me parece que você precisa de qualquer armadilhas; basta substituir sua declaração mongorestore por:

( mongorestore ...
  exit_code=$?
  [ $exit_code -ne 0 ] \
  && printf "Process %s for file %s failed with exit code %s\n" \
       $BASHPID  "${file%.*}" $exit_code
) &

BTW, uma maneira simples de verificar se todos os subprocessos foram gerados em paralelo é abrir outro terminal e executar pgrep -a mongorestore .

Além disso, o uso de EXIT_CODE no final do seu script parece nunca ter um valor, portanto, o comando exit deve falhar com algum tipo de erro, o que significaria que seu script sempre sairia com um erro. erro.

    
por 04.03.2018 / 23:26