Vamos supor que eu tenha cinco .sh
scripts Bash ( ) em uma pasta ( my_folder
) e eles sejam nomeados da seguinte maneira:
script_1.sh
script_2.sh
script_3.sh
script_4.sh
script_5.sh
Como posso escrever um sexto script Bash ou apenas um liner que começará a executar todos esses scripts juntos?
Eu preciso dos cinco scripts para começar a executar todos juntos ao mesmo tempo e não um após o outro.
Respostas:
O GNU
parallel
é perfeito para esse tipo de coisa. Instale comsudo apt install parallel
e, em seguida:Os
-j
controles quantos processos t correm em paralelo, e-j0
significa "todos eles". Defina-o com outro valor (por exemplo-j20
) para executar os scripts em lotes.fonte
parallel
comando domoreutils
pacote. O exemplo de uso:parallel -j 20 -- my_folder/*.sh
(Diferentemente do GNUparallel
,-j0
os scripts eram executados um de cada vez).sudo apt install parallel
substituirá o arquivo/usr/bin/parallel
pelo do paralelo GNU. Portanto, desde que você o instale, como sugere minha resposta, deve funcionar conforme o esperado.parallel
comandos sem êxito do manual enquanto escrevia minha resposta para sugerir o GNU paralelo.Para executar todos os scripts ao mesmo tempo (em paralelo), use:
Para executar um após o outro (sequencialmente), use:
Aprimoramento para comentários
Se você possui 200 scripts que deseja executar ao mesmo tempo (o que pode atolar a máquina BTW), use este script:
Defina os atributos de script como executáveis com o comando:
Na primeira vez em que você executar o script, ele fará eco apenas dos nomes dos 200 scripts que estará executando. Quando estiver satisfeito, os nomes certos serão selecionados, edite o script e altere esta linha:
para:
Há três maneiras de chamar um script bash de outro, conforme respondido aqui:
No caso do OP, um ou mais dos 200 scripts não continham a
#!/bin/bash
primeira linha shebang no arquivo. Como tal, a opção 3. teve que ser usada.200 scripts em execução ao mesmo tempo
Um comentário foi levantado sobre se eles estão "rodando ao mesmo tempo". Em um sistema típico de 8 CPUs, 25 scripts compartilharão uma CPU ao mesmo tempo, mas apenas um script será executado por vez até que o intervalo de tempo (medido em milissegundos) se esgote. Em seguida, o próximo trabalho receberá sua parte justa de milissegundos, depois o próximo trabalho, etc., etc.
Em termos gerais, podemos dizer que 200 trabalhos estão sendo executados "simultaneamente", mas não "simultaneamente" em 8 CPUs, o que equivale a 25 trabalhos por CPU:
Imagem acima e comentários abaixo do planejador do kernel do Linux
fonte
bash
prefixo da chamada do script.Existe uma ferramenta para isso, leia
man run-parts
.Por exemplo, eu faço:
no meu script de backup do Palm Pilot.
${visorhome}/pbackup.d/
:fonte
run-parts
executa os scripts sequencialmente em vez de todos de uma vez, conforme solicitado pelo OP. Você está certo, no entanto, que é improvável que a execução de 200 scripts de uma só vez execute o mesmo que a execução de 5 - e mesmo que executá-los todos de uma vez não cause problemas, ainda pode ser desnecessário. Eu comentou a sugerir o OP esclarecer suas preferências quanto a isso.run-parts
não executará os scripts (eles têm um ponto no nome:my_folder/*.sh
run-parts
tem requisitos de nome de arquivo muito específicos por algum motivo estranho. Ele não inicia nomes de arquivos com extensões, então, temo que isso não funcione aqui.Para executar todos os
*.sh
scripts nomy_folder
diretório ao mesmo tempo usandoxargs
:Para limitar o número de scripts executados simultaneamente
10
:fonte
ls
em um script. Usarfind
é muito mais seguro. É o primeiro item aqui: mywiki.wooledge.org/BashPitfalls#for_f_in_.24.28ls_.2A.mp3.29