Script Bash que não dorme ao executar scripts em paralelo

1

Eu tenho vários scripts bash que preciso executar em paralelo. No entanto, eles são hogs de memória, então eu gostaria de escalonar cada um deles em 30 segundos, mas ainda rodar em paralelo. Por exemplo:

hourr=($(seq 0 1 23))

for q in "${hourr[@]}";
do;
echo $q; sleep 10;
done

Isso aguarda 10 segundos e, em seguida, gera um número, seqüencialmente, de 0 a 23. No entanto, quando tento fazer isso com meus scripts:

hourr=($(seq 0 1 23))
input1="20160101"; 
input2="10"; #(Note: These are inputs to each of the scripts I want to run)
scriptdir="/path/to/somewhere"
for q in "${hourr[@]}"
do
if [ "${#q}" == "1" ]
then
hh=0${q}
else
hh=${q}
fi
echo $hh
( bash $scriptdir/Hour$hh.csh $input1 $input2 ; sleep 30 ) &
done
wait
echo "All done!"

No entanto, todos os scripts Hour são executados de uma só vez (corretamente e em paralelo) quando o script principal é executado e não aguarda os 30 segundos que eu especifiquei para executar um após o outro. Alguma idéia?

    
por Micheal Simpson 27.04.2018 / 18:15

1 resposta

1

E se você fizesse assim?

#/bin/bash

input1='20160101'
input2='10' #(Note: These are inputs to each of the scripts I want to run)
scriptdir='/path/to/somewhere'
for q in {00..23}
do
    hh="${q}"
    echo "$hh"
    ( bash "$scriptdir/Hour$hh.csh" "$input1" "$input2" ) &
    sleep 30
done
wait
echo "All done!"

Como foi apontado nos comentários, o & está fazendo com que seu sleep também seja executado em segundo plano e, portanto, seu script não esperará que ele termine antes de passar para a próxima iteração do loop. Também sua matriz hourr é desnecessária

    
por 27.04.2018 / 18:43

Tags