Para cada arquivo, os comandos echo Starting on file foo.txt
, mkdir foo
, cd foo
, longCMD3 ../foo.txt > /dev/null
e echo Finished file foo.txt
são executados sequencialmente, ou seja, cada comando é iniciado depois que o anterior é concluído.
Os comandos para arquivos diferentes são intercalados. Por padrão, o comando paralelo executa tantos trabalhos em paralelo quanto os núcleos.
No entanto, a saída dos comandos não é intercalada por padrão. É por isso que você não vê muitas linhas "Iniciais" e depois as linhas "Concluídas" correspondentes. Grupos paralelos a saída de cada trabalho em conjunto. Ele armazena a saída até que o trabalho seja concluído. Veja a descrição da opção --group
no manual. O agrupamento não faz sentido no seu caso, portanto, desative-o com a opção --ungroup
( -u
) ou mude para o agrupamento de linhas com --line-buffer
.
Algumas outras correções:
-
A análise de ls não é confiável . Passe os nomes dos arquivos para
parallel
diretamente. - Se
mkdir
falhar, você não deve continuar. Se algum comando falhar, você deverá providenciar a falha do trabalho. Uma maneira fácil de fazer isso é iniciar o script do job comset -e
.
parallel --line-buffer 'set -e; echo Starting on file {}; mkdir {.}; cd {.}; longCMD3 ../{} > /dev/null; echo Finished file {}' ::: *.txt