como esperar por muitos trabalhos em segundo plano em bash [closed]

2

Como posso fazer processamento paralelo no bash?

Minha abordagem, no meu script bash, incluiu tantas tarefas em segundo plano com & e, em seguida, estou adicionando cada ID de processo usando uma matriz, então estou buscando essa matriz usando um loop e usando o comando wait , mas de alguma forma o comando wait não está funcionando.

meu código é assim

for i in some path 
do 
    ls -d $i | xargs du -kh --max-depth=0 |sed 's/\t/,/g' >> $TEMP/Outfile/disk_usage_Session_wise.csv & 
    pid=$!
    ls -d $i/session | xargs du -kh --max-depth=1 | sed 's/\t/,/g' >> $TEMP/Outfile/disk_usage_Session_wise.csv & 
    pid_1=$! 
    process_list=($pid $pid_1) 
done 

for job in echo ${process_list[@]} 
    do 
    echo "$job is running" 
    wait $job # this command is not working 
done –
    
por Ashish Sahoo 06.12.2016 / 17:11

2 respostas

2

Você pode usar software adicional ou apenas bash? Parece que GNU Parallel é o que você precisa para sua tarefa. Ou pelo menos -n e -P argumentos para xargs

    
por 06.12.2016 / 18:17
0

Esta linha aprimorada deve corrigir a primeira parte do seu script:

process_list+=($pid $pid_1) 

E esta deve ser a segunda parte. Observe que não foi testado.

for job in ${process_list[@]} 
do 
    ps -ho pid | >/dev/null grep $job && {
        echo "$job is running" 
        wait $job # this command should be ok now         
    }
done
  • ps -ho pid produz uma lista de processos em execução ( -o pid ) sem a linha de título ( -h ).

  • Encaminha ( | ) esta lista para grep

  • grep procura o $job e, se ele encontrar ( && ), o bloco de comandos ( {echo ...} ) é executado

por 06.12.2016 / 18:17

Tags