Como manter um número específico de processos em execução?

3

Estou tentando escrever um script de shell para converter muitos arquivos .wav para .mp3. Eu uso o comando "find" para encontrá-los, depois o comando "lame" para converter. Eu posso usar um loop for simples para isso, mas eu preciso fazer isso usando vários processos paralelos.

Eu quero ter um número definido de processos, por exemplo 4. Comece a converter um arquivo em cada processo. Quando um arquivo termina de converter em um processo, eu o substituo pelo próximo arquivo. Qual é a melhor maneira de abordar isso?

    
por nicusor 04.05.2015 / 15:49

4 respostas

2

Eu sugeriria passar a lista para xargs e usar as opções -n e / ou -P para controlar quantos processos estão sendo executados a qualquer momento.

    
por 04.05.2015 / 15:52
2

make pode ser bom para isso. Você precisará de um Makefile com algo como

%.mp3: %.wav
lame $(LAMEOPTS) $< $@

Em seguida, gere uma lista de destinos:

$ find . -name '*.wav' -type f | sed -e 's/\(.*\.\)wav$/all: mp3/' >>Makefile

Agora, diga make para agendar as tarefas:

$ make -r -j4 -f Makefile
    
por 04.05.2015 / 17:30
2

Estou surpreso que ninguém tenha mencionado o GNU paralelo ainda. Usando-o, o comando seria tão simples quanto:

find -type f -name '*.wav' -print0 | parallel -0 lame {} {.}.mp3

Isso pede para substituir a extensão de cada arquivo de entrada por mp3 . Por padrão, o paralelismo executará tantos trabalhos quantos os processadores na máquina, mas você pode definir um valor diferente com -j <i>integer</i> . O switch --dry-run pode ser útil para ver quais comandos seriam executados.

    
por 05.05.2015 / 01:24
0

Se você tiver xjobs instalado, verá que este é exatamente o tipo de tarefa para o qual foi projetado. Em particular, verifique a descrição da opção -j para ajustar quantos processos são criados.

    
por 04.05.2015 / 17:33