Como executo dois comandos diferentes de longa execução ao mesmo tempo em um script bash?

3

Eu tenho que chmod e chown centenas de milhares de arquivos como parte de um script de migração. Cada comando leva cerca de uma hora e meia para ser concluído. Eu percebi que essas duas operações podem ser executadas ao mesmo tempo, o que reduz o tempo de execução, o que eu confirmei testando no shell.

Eu sei o truque de colocar comandos em segundo plano com '&', mas preciso garantir que ambos os processos sejam concluídos antes de prosseguir com o restante do script.

Obrigado

    
por reconbot 19.06.2010 / 17:44

3 respostas

11

Use o comando wait .

Esta demonstração:

#!/bin/bash
echo $SECONDS
sleep 12&
sleep 15&
jobs
wait
echo $SECONDS
echo "jobs are done"

Produz esta saída:

0
[1]-  Running                 sleep 12 &
[2]+  Running                 sleep 15 &
15
jobs are done

Há uma pausa de quinze segundos antes das duas últimas linhas serem exibidas.

    
por 19.06.2010 / 17:50
2

Você pode capturar o pid e usar a espera.

chmod options
CHMODPID=$!
chown options
CHOWNPID=$!
wait $CHMODPID
wait $CHOWNPID

(deve funcionar com o bash; os detalhes podem ser diferentes em outros tipos de shell)

    
por 19.06.2010 / 22:53
0

Se você precisar garantir que ambos os processos sejam concluídos antes de prosseguir para a próxima etapa, uma solução simples seria escrever algo em um arquivo e verificá-lo. Basta fazer uma cabeça ou gato no arquivo (com o valor padrão 0) e adicionar 1 à primeira linha. Se você detectar 2, os dois processos serão concluídos. Claro que a adição deve ser feita na parte inferior dos seus scripts.

    
por 21.06.2010 / 05:31