Encontre e execute vários scripts em paralelo

3

G'day

Eu tentei resolver esse problema a manhã toda, mas não tive sucesso. Eu gostaria de procurar por determinados scripts em uma pasta específica e executá-los todos em paralelo. Os scripts têm nomes diferentes, mas todos terminam com "run.sh". Abaixo o que eu tentei sem sucesso.

A primeira abordagem foi usar find em combinação com -execdir. Isso funciona, no entanto, os scripts são executados de forma sequencial. Eu quero que todos os scripts sejam executados simultaneamente (paralelos). Parece não haver nenhuma opção para conseguir isso com -execdir

find . -name "*run.sh" -type f -execdir 'nohup' {} '&' \;

Em seguida, tentei usar xargs porque existe uma opção paralela (-P). Eu não tentei a opção paralela ainda, porque não consigo obter xargs para executar os scripts em suas respectivas subpastas. Os comandos abaixo executam todos os scripts, mas fazem isso na pasta em que estou executando o comando, portanto os próprios scripts não funcionam. Os scripts devem ser executados em suas próprias subpastas. No exemplo acima, -execdir está fazendo isso ao contrário de -exec. Como faço para conseguir isso com xargs?

nohup find . -name "*run.sh" -type f | xargs -0 -I{} bash -c f\ \{\}

ou

nohup find . -name "*run.sh" -type f | xargs -0 -I{} bash -c "f {}"

ou

nohup find . -name "*run.sh" -type f | xargs -0 -I{} bash -c "./{}" 

Estou muito frustrada e espero que exista alguém que possa ajudar. Muito obrigado!

    
por coder85 02.12.2014 / 11:39

2 respostas

4

Inspirado pela resposta da choroba:

find . -iname '*run.sh' -printf 'cd %h; ./%f
find . -iname '*run.sh' -printf 'cd %h; ./%f%pre%' | xargs -L1 -0 -P0 bash -c
' | xargs -L1 -0 -P0 bash -c

Você pode usar -printf para criar a linha de comando. %h é o diretório onde o arquivo está localizado e %f é o nome do arquivo sem o caminho (o nome da base). A opção -P ativa o paralelismo em xargs e -L1 -0 faz com que ela use uma linha de entrada terminada por caractere nulo por comando.

    
por muru 02.12.2014 / 12:07
1

Que tal criar as linhas de comando que você deseja executar e, em seguida, executá-las?

find . -name '*run.sh' -type f -exec \
    echo 'c={}; cd ${c%/*} && nohup "./${c##*/}" &' \;

Se a saída for o que você deseja, basta anexar | bash e executar novamente.

    
por choroba 02.12.2014 / 11:51