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 .

  • Unix sepaira vários commands que tem '&' (executair em segundo plano) no final
  • BASH: append saída em loop paira um email
  • Como faço paira executair o TomEE como um service no RHEL6?
  • obter o uso de swap paira um process
  • Se eu iniciair um process em segundo plano e depois sair, isso continuairá a ser executado?
  • Redirecionamento bash sem bloqueio
  • Obtenha algum significado dos logs do apache com awk e grep
  • É possível obter "find -exec" expandir backticks paira cada file encontrado?
  • Posso executair um script localmente, mas não posso fazer "ssh HOSTNAME /path/to/script.sh"
  • mysqldump via script bash crashndo com "Nenhum file ou diretório desse tipo"
  • obter notificação quando o service monitorado pelo sistema entra no estado crashdo