Executando vários scripts bash com nomes diferentes em paralelo

1

Eu preciso executar um comando para cada instância individual de um determinado nome de variável em paralelo. Às vezes, pode haver quatro variáveis, outras vezes pode haver 100. Por exemplo, digamos que eu tenha esse conjunto de dados em particular como:

datanames='KQPW KMMX KMKO KZAO'

Eu preciso executar um processo para cada um que deve ser executado em paralelo uns com os outros. Em outras palavras, eu preciso executar o process1 para o KQPW enquanto estiver executando o process1 para o KMMX enquanto ... etc. O Process1 requer uma entrada baseada no nome da variável.

A partir dos tutoriais que li e de algumas escavações iniciais, instalei o comando 'paralelo' do GNU. Eu coloquei todos os nomes de dados em um arquivo de texto chamado "run.txt":

KQPW.csh
KMMX.csh
KMKO.csh
KZAO.csh

em que cada um dos arquivos .csh contém o comando para chamar process1 com o nome da variável exclusiva como a entrada necessária para process1. A questão é: como executo todos esses quatro comandos de uma só vez? Eu tentei:

cat run.txt | parallel

mas nada aconteceu. Alguma idéia?

    
por Micheal Simpson 11.04.2018 / 20:05

2 respostas

0

Uma rápida demonstração da execução de scripts com base descrita em paralelo, sem o uso de ferramentas externas:

#!/bin/bash
datanames='KQPW KMMX KMKO KZAO'
datanamesarray=($datanames)
for item in ${datanamesarray[@]}; do
  ( ./${item}.csh; sleep 10 ) &
done
echo waiting..
wait
echo done

Executar isto exibirá waiting.. seguido por um atraso de dez segundos, já que todas as sub-sockets são executadas em paralelo. wait irá pausar o script pai até que todas as sub-unidades tenham terminado antes de prosseguir. As instruções echo , sleep e wait estão aqui para fins demonstrativos.

    
por 11.04.2018 / 20:20
0

O que você está fazendo deve funcionar. Se você puder fazer:

$ KMMX.csh

então o GNU Parallel também deve ser capaz de rodar o script. A primeira etapa de depuração é executar parallel com --dry-run , que informará o que está sendo executado:

cat run.txt | parallel --dry-run

Existem, no entanto, várias coisas na sua pergunta que me intrigam:

  • O título da pergunta menciona bash , mas você chama seus scripts *.csh Seu shell interativo é bash , mas os scripts csh -files?
  • Você não mencionou que colocou os arquivos em um diretório em $PATH , mas não se refere aos scripts com caminho (por exemplo, ./KMMX.csh ). Isso poderia explicar por que isso não funciona. Embora você deva receber uma mensagem de erro.
  • Você não menciona que tem chmod +x dos arquivos. Isso poderia explicar por que isso não funciona. Embora você deva receber uma mensagem de erro.

Mas acima de tudo eu me preocupo que você esteja fazendo isso mais difícil consigo mesmo do que precisa ser. O GNU Parallel é projetado para criar comandos a partir de um modelo, e parece que seus *.csh -files também são construídos a partir de um modelo com a única alteração sendo o nome do dado.

Meu palpite é que você pode alterar sua configuração para:

$ parallel doit {} ::: KQPW KMMX KMKO KZAO

onde doit é um script / função que usa o nome do dado como um argumento.

Recomendamos que você assista aos vídeos introdutórios para uma introdução rápida: link Depois, veja os EXEMPLOS depois da lista de OPÇÕES (Use LESS = + / EXAMPLE: man parallel). Isso lhe dará uma idéia do que o GNU parallel é capaz de fazer. Depois passe algumas horas percorrendo o tutorial (man parallel_tutorial).

Sua linha de comando vai amar você por isso.

    
por 12.04.2018 / 07:52