Primeiro, crie um script wrapper que mude para o diretório fornecido no primeiro (e único) argumento de linha de comando, execute o setup / variable-initialisation / etc de que ele precisa e execute seus 10 scripts em sequência com quaisquer args eles precisam.
Por exemplo, se cada script processa todos os arquivos .jpg, .png e .gif no diretório:
#! /bin/bash
# example-wrapper.sh
cd "$1"
script1 *.{jpg,png,gif}
script2 *.{jpg,png,gif}
script3 *.{jpg,png,gif}
script4 *.{jpg,png,gif}
script5 *.{jpg,png,gif}
script6 *.{jpg,png,gif}
script7 *.{jpg,png,gif}
script8 *.{jpg,png,gif}
script9 *.{jpg,png,gif}
script10 *.{jpg,png,gif}
Em seguida, use find
para enviar uma lista de diretórios para parallel
.
find /path/to/parent/ -mindepth 1 -type -d -print0 |
parallel -0 -n 1 ./example-wrapper.sh
(a opção -mindepth 1
em find
exclui o diretório de nível superior, ou seja, o próprio diretório pai)
Por padrão, o paralelismo executará uma instância (um "trabalho") de ./example-wrapper.sh
para cada núcleo da CPU que você possui. Cada instância receberá um nome de diretório ( -n 1
). Assim que um trabalho termina, outro é iniciado (se houver algum trabalho restante para ser executado).
Isso maximiza o uso da energia disponível da CPU, sem permitir que as tarefas compitam entre si pelo tempo de CPU.
Você pode usar a opção parallel
de -j
para ajustar o número de tarefas a serem executadas de uma só vez. Para tarefas com uso intensivo de CPU, o padrão de um trabalho por núcleo do sistema é provavelmente o que você deseja.
Se seus trabalhos não exigem muito da CPU, mas tendem a ser mais E / S, você pode executar 2 ou 3 trabalhos para cada núcleo (dependendo do tamanho dos arquivos de entrada, da rapidez com que armazenamento é, e que tipo de dispositivos compõem esse armazenamento - por exemplo, os SSDs não sofrem de latência de busca, portanto, não serão retardados por vários processos que buscam dados de todo o disco. de ser feito para procurar aleatoriamente em todo o lugar - o armazenamento em buffer / armazenamento em cache do Linux ajudará, mas não eliminará o problema).
Se você deseja executar outro trabalho (por exemplo, uso normal da área de trabalho) enquanto esses trabalhos estão em execução, use -j
para informar parallel
para usar um ou dois núcleos a menos do que o seu sistema (por exemplo, -j 6
em um Sistema de 8 núcleos).
NOTA: Ajustar os processos paralelos é uma boa arte e pode levar algumas experiências para obter os melhores resultados.
De qualquer forma, de man parallel
:
--jobs N
,-j N
,--max-procs N
,-P N
Number of jobslots. Run up to N jobs in parallel. 0 means as many as possible. Default is 100% which will run one job per CPU core.
If
--semaphore
is set default is 1 thus making a mutex.
Este é um uso realmente básico e primitivo de parallel
. Pode fazer muito mais. Veja a man page para detalhes.
BTW, xargs
também tem uma opção -P
para executar trabalhos em paralelo. Para um uso simples como esse, faz pouca diferença se você usa xargs -P
ou parallel
. Mas se seus requisitos forem mais complicados, use parallel
.
parallel
deve ser empacotado para a maioria das distribuições Linux, caso contrário, está disponível no link