Suponha que eu tenho três (ou mais) scripts bash: script1.sh
, script2.sh
, e script3.sh
. Gostaria de chamar todos esses três scripts e executá-los em paralelo . Uma maneira de fazer isso é apenas executar os seguintes comandos:
nohup bash script1.sh &
nohup bash script2.sh &
nohup bash script3.sh &
(Em geral, os scripts podem levar várias horas ou dias para serem concluídos, portanto, eu gostaria de usá-los nohup
para que continuem sendo executados mesmo que meu console seja fechado.)
Mas, existe alguma maneira de executar esses três comandos em paralelo com uma única chamada?
Eu estava pensando em algo como
nohup bash script{1..3}.sh &
mas isso parece executar script1.sh
, script2.sh
e script3.sh
em sequência, não em paralelo.
nohup bash script{1..100}.sh &
oufor i in {1..100}; do nohup bash script{1..100} &; done
), em vez de digitarnohup bash script*.sh &
100 vezes diferentes.screen
(outmux
) para resolver o problema do console, mas manter o acesso à saída (e entrada).nohup ... & nohup ... & nohup ... &
. Se você quer dizer que deseja executar todos os scripts sem digitar cada nome de script individualmente, um loop simples fará isso.Respostas:
fonte
Uma maneira melhor seria usar o GNU Parallel . O paralelo GNU é simples e, com ele, podemos controlar o número de trabalhos a serem executados em paralelo, com mais controle sobre os trabalhos.
No comando abaixo,
script{1..3}.sh
é expandido e enviado como argumento parabash
em paralelo. Aqui-j0
indica que o maior número possível de trabalhos deve ser executado. Por padrão,parallel
executa um trabalho para um núcleo de CPU.E você também pode tentar usar
Ao executar o segundo método, se você receber alguma mensagem de erro, significa que a
--tollef
opção está definida/etc/parallel/config
e que precisa ser excluída e tudo funcionará bem.Você pode ler
GNU Parallels
página de manual aqui para obter opções mais ricas.E, se você estiver executando os trabalhos em uma máquina remota, use melhor
screen
para que a sessão não seja fechada devido a problemas de rede.nohup
não é necessário, já que as versões recentes do festa como vindo comhuponexit
quantooff
e isso vai impedir shell pai de envio deHUP
sinal para os seus filhos durante a sua saída. Caso não esteja desmarcado, faça-o comfonte
bash
como o shellparallel -j0 bash :::: <(ls script{1..3}.sh)
pode ser reduzido paraparallel -j0 bash :::: script{1..3}.sh
, não?parallel -j0 bash ::: script{1..3}.sh
?bash ::: script{1..3}.sh
sendo passado paraparallel
, não::: script{1..3}.sh
. Portanto, este deve primeiro expandir paraparallel bash ::: script1.sh script2.sh script3.sh
pelo shell e, em seguida,parallel
invocações debash script1.sh
,bash script2.sh
,bash script3.sh
. Eu tenteiparallel -j0 bash ::: script{1..3}.sh
- isso é melhor do que a::::
abordagem, pois evita a necessidade de substituição de processo. Também analisar saída de ls é montado com armadilhasTambém podemos usar
xargs
para executar vários scripts em paralelo.aqui cada script é passado para o bash como argumento separadamente.
-P 0
indica que o número de processos paralelos pode ser o máximo possível. Também é mais seguro usar o bash defaultjob control feature
(&)
.fonte
Uma solução de linha única :
Com menos facilidade, basta usar um script de wrapper:
Ou faça um loop sobre eles:
fonte
Se você deseja economizar algum esforço de digitação
Ou pensando melhor, talvez não
fonte
Faça o checkout desta ferramenta: https://github.com/wagoodman/bashful
Diga que você tem
mytasks.yaml
comE você executa assim:
Seus scripts seriam executados em paralelo com uma barra de progresso vertical (+ eta se você o executou antes e o tempo é determinístico). Você pode ajustar quantas tarefas deseja executar em paralelo se começar a executar mais do que apenas as três aqui fornecidas:
Disclaimer: Eu sou o autor.
fonte
Estou sugerindo um utilitário muito mais simples que acabei de escrever. Atualmente, é chamado de par, mas será renomeado em breve para parl ou pll, ainda não decidido.
https://github.com/k-bx/par
API é tão simples quanto:
fonte
Usar paralelo
https://github.com/keithamus/parallelshell
fonte