executa vários comandos de uma só vez

2

Eu preciso executar muitos comandos semelhantes o mais rápido possível e usar todos os recursos disponíveis.

Por exemplo, meu caso está processando imagens quando estou usando o seguinte comando: for INPUT in *.jpg do; some_command; done o comando é executado um por um e não usa todos os recursos disponíveis.

Mas do outro lado, executar for INPUT in *.jpg do; some_command &; done faz a máquina ficar sem recursos em um tempo muito curto.

Eu sei sobre o comando at ' batch , mas não tenho certeza se posso usar isso no meu caso. Corrija-me se estiver errado.

Então eu estava pensando em colocar os comandos em algum tipo de fila e executar apenas uma parte deles de uma só vez. Eu não sei como fazer isso de uma maneira rápida e esse é o problema. Tenho certeza que alguém correu em um problema semelhante antes.

Por favor, informe.

    
por Roomy 27.11.2017 / 19:20

2 respostas

2

O GNU Parallel é feito exatamente para isso:

parallel some_command {} ::: *.jpg

O padrão é um trabalho por núcleo da CPU. No seu caso, você pode querer executar mais um trabalho do que os núcleos:

parallel -j+1 some_command {} ::: *.jpg

O GNU Parallel é um paralelizador geral e facilita a execução de trabalhos em paralelo na mesma máquina ou em várias máquinas para as quais você tem acesso ssh.

Se você tem 32 tarefas diferentes que você quer rodar em 4 CPUs, uma forma direta de paralelizar é rodar 8 tarefas em cada processador:

O

GNUParallelgeraumnovoprocessoquandoumtermina-mantendoasCPUsativaseeconomizandotempo:

Instalação

Por razões de segurança, você deve instalar o GNU Parallel com seu gerenciador de pacotes, mas se o GNU Parallel não estiver empacotado para sua distribuição, você pode fazer uma instalação pessoal, que não requer acesso root. Isso pode ser feito em 10 segundos ao fazer isso:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

Para outras opções de instalação, consulte o link

Saiba mais

Veja mais exemplos: link

Assista aos vídeos de introdução: link

Percorra o tutorial: link

Inscreva-se na lista de e-mail para obter suporte: link

    
por 01.12.2017 / 01:21
2

Você pode usar o GNU make com a opção --jobs para executar as coisas em paralelo, mas limitado ao número especificado de tarefas. Você pode adaptar esse número a algo que não mata sua máquina.

Aqui está um exemplo de Makefile que usa os alvos a-h (estes podem ser seus arquivos de saída, por exemplo) e executa um conjunto (fictício) de comandos para cada alvo:

all: a b c d e f g h

a b c d e f g h:
    echo $@; sleep 10

N.B. O recuo do comando deve ser um caractere TAB. Veja o GNU make documentation para detalhes da sintaxe de Makefiles.

Você pode invocar make com make --jobs 4 e obter a seguinte saída (usei time make --jobs 4 below para mostrar o tempo decorrido):

echo a; sleep 10
echo b; sleep 10
echo c; sleep 10
echo d; sleep 10
b
a
c
d
echo e; sleep 10
echo f; sleep 10
echo g; sleep 10
e
f
echo h; sleep 10
g
h

real    0m20.009s
user    0m0.010s
sys 0m0.011s

Os primeiros quatro foram executados em paralelo, depois os quatro seguintes, então o total decorrido é de 20 segundos.

    
por 27.11.2017 / 19:26