Como posso esperar que as tarefas nohup sejam concluídas em um script de shell?

2

Eu tenho o seguinte script:

echo "$wk" | while read -r a b;
do
    counter=$(($counter+1))
    nohup sh -c 'impala-shell -d nielsen -f query.sql --var=dt=$a --var=incre=$b;
    echo $a,$?>>$week_status_file;
    if [ $? -ne 0 ]; then
        echo $a,$b>>$err_week_file
    fi'
    if [ $(($counter%5)) == 0 -a $counter -ge 5 ];
    then
        echo "Check"
        wait
    fi
done

A idéia é lançar o comando empacotado impala-shell... com duas variáveis a e b (provenientes da variável wk ). Isso deve ser feito em paralelo com 5 processos. Os próximos 5 trabalhos devem esperar até que os 5 processos anteriores sejam concluídos. Meu código atual imprime Check , mas não aguenta nada. No entanto, se eu alterar wait para sleep 10s , ele dorme.

Como faço com que wait funcione aqui?

    
por lovechillcool 02.03.2018 / 21:56

1 resposta

1

Você precisa fornecer identificadores de processo (PIDs) para wait . Também a partir da sua descrição, não parece que o seu comando esteja bloqueando, o que, em última análise, dificultaria a coleta dos PIDs pelos quais você deseja aguardar. Por exemplo. se o processo for forking e permitir que o script continue sem conhecer o novo PID dos processos bifurcados.

Mas, caso a linha nohup sh -c ... esteja bloqueando, você deseja enviá-la para o plano de fundo com & , salvar o PID dos processos em segundo plano e finalmente aguardar todos os PIDs salvos (por exemplo, em $WAIT_FOR_PIDS ). Variável $! fornece o PID do último processo enviado para execução em segundo plano.

WAIT_FOR_PIDS="";
echo "$wk" | while read -r a b;
do
    counter=$(($counter+1))
    nohup sh -c 'impala-shell -d nielsen -f query.sql --var=dt=$a --var=incre=$b;
    echo $a,$?>>$week_status_file;
    if [ $? -ne 0 ]; then
        echo $a,$b>>$err_week_file
    fi' & WAIT_FOR_PIDS="$WAIT_FOR_PIDS $!"
    if [ $(($counter%5)) == 0 -a $counter -ge 5 ];
    then
        echo "Check"
        wait $WAIT_FOR_PIDS
        WAIT_FOR_PIDS=""
    fi
done

Além disso, você deve pensar nas condições de corrida enquanto ecoa em paralelo em $week_status_file . Veja man flock para facilitar o bloqueio de arquivos acessíveis por shell.

    
por 03.03.2018 / 00:40