As duas instâncias do seu script podem certamente interagir dessa maneira, fazendo com que o comando seja executado duas vezes. Isso é chamado de condição de corrida .
Uma maneira de evitar essa condição de corrida seria se cada instância pegasse seu arquivo de entrada movendo-o para outro diretório. Mover um arquivo (dentro do mesmo sistema de arquivos) é atômica . Mover os arquivos de entrada pode não ser desejável, e isso já está ficando um pouco complicado.
mkdir staging-$$ making-$$
for input in folder/*; do
name=${x#folder/}
staging=staging-$$/$name
output=making-$$/$name
destination=done/$name
if mv -- "$input" "$staging" 2>/dev/null; then
bin/myProgram "$staging" >"$output"
mv -- "$output" "$destination"
mv -- "$staging" "$input"
fi
done
Uma maneira simples de processar os arquivos em paralelo usando uma ferramenta amplamente disponível é o make do GNU , usando o < href="http://www.gnu.org/software/make/manual/make.html#Parallel"> -j
sinalizador para execução paralela . Aqui está um makefile para esta tarefa (lembre-se de usar abas para indentar comandos):
all: $(patsubst folder/%,done/%,$(wildcard folder/*))
done/%: folder/%
./bin/myProgram $< >[email protected]
mv [email protected] $@
Execute make -j 3
para executar 3 instâncias em paralelo.
Veja também Quatro tarefas em paralelo ... como faço isso?