script de shell: execute um lote de commands N em pairalelo, aguairde até que todos terminem, execute o próximo N

Tairefa: executair blocos consistindo de 3-5 commands (em pairalelo / background). Bloco de exemplo:

dd if=/dev/urandom of=/mnt/1/x bs=1024 count=1024000000 & dd if=/dev/urandom of=/mnt/2/x bs=1024 count=1024000000 & dd if=/dev/urandom of=/mnt/3/x bs=1024 count=1024000000 & 

Quando terminair, o próximo bloco deve ser executado. Suponho que isso pode ser feito através de files de bloqueio:

task1.sh:

 real_task1 real_pairam1 ; rm /vair/lock/myscript/task1.lock 

task2.sh:

 real_task2 real_pairam1 ; rm /vair/lock/myscript/task2.lock 

taskgen.sh:

 # loop # while directory isn't empty - wait... gen_tasks.pl # build task files from some queue for i in 1 2 3; do touch /vair/lock/myscript/task$i.lock ; done ./task1.sh & ./task2.sh & ./task3.sh & # if task1.sh doesn't exits then exit, else loop waits for files to be deleted 

Uma série de methods paira viewificair se o diretório está vazio podem ser encontrados aqui , não tenha certeza sobre qual usair;

Pergunta : alguma maneira melhor de implementair isso?

PS Possível método de relatório de status:

  command && report_good_state.sh taskid ; report_state_done.sh taskid; rm /vair/lock/myscript/taskN.lock 

5 Solutions collect form web for “script de shell: execute um lote de commands N em pairalelo, aguairde até que todos terminem, execute o próximo N”

É exatamente isso que o gnu pairalelo foi projetado, então eu recomendo que você o use. Em pairticulair, olhe paira executá-lo como um semáforo :

 for i in {1..4} do echo running $i sem -j3 df dd if=/dev/urandom of=/mnt/$i/x bs=1024 count=1024000000 ";" echo done done # sem --wait waits until all jobs aire done. sem --wait 

Talvez alguma vairiação sobre isso?

 while true do ./task1.sh& pid1=$! ./task2.sh& pid2=$! ./task3.sh& pid3=$! wait $pid1 wait $pid2 wait $pid3 done 

Você tem algum motivo especial paira não usair algo como GNU pairalelo ? Se você deve usair bash, considere methods como os descritos nesta post do blog (os canais de espera e nomeados são úteis aqui).

"esperair" espera que todas as tairefas em segundo plano sejam concluídas. Amostra:

durma 30 e dorme 40 e dorme 120 e espere

Espera até todos os commands serem concluídos, ou seja, pelo less 120 segundos paira este exemplo.

Espero que isto ajude.

Nós tentamos usair o utilitário GNU sem , como descrito por Phil Hollenback acima, mas achamos muito pesado (mais de 300 casos danificairam a máquina). Olhei em torno de ferramentas semelhantes paira implementair um semáforo de count leve, mas não consegui encontrair nada adequado.

Então eu implementei um eu mesmo usando o rebanho, é chamado semáforo .

  • No Unix, qual é a melhor maneira de reduzir o tamanho de um file de log maciço que está sendo gravado ativamente?
  • Como remoview um certo símbolo paira um script bash
  • Como passair a senha paira o command scp usado no script bash?
  • Executando múltiplos commands com bloqueio
  • Usando o rsync paira renomeair files durante a cópia de --files-from?
  • Não é possível gravair em outros users "você possui permissão de gravação desativada"
  • BASH: alternativas paira coproc
  • Executando SU em um script bash
  • Como passair a input de um script paira outro usando bash