Execute o mesmo comando várias vezes em segundo plano

10

Como é possível executar vários comandos e fazer o background deles usando o bash?

Por exemplo:

$ for i in {1..10}; do wait file$i &; done

onde wait é um binário personalizado.

Neste momento, recebo um erro:

syntax error near unexpected token ';'

ao executar o comando acima.

Uma vez em segundo plano, os comandos devem ser executados em paralelo.

    
por Sebi 23.03.2016 / 16:12

4 respostas

17

O & , assim como ; , é um operador de terminador de lista . Eles têm a mesma sintaxe e podem ser usados de forma intercambiável (dependendo do que você deseja fazer). Isso significa que você não quer, ou precisa, command1 &; command2 , tudo que você precisa é command1 & command2 .

Então, no seu exemplo, você poderia escrever:

for i in {1..10}; do wait file$i & done

e cada comando wait será lançado em segundo plano e o loop passará imediatamente para o próximo.

    
por 23.03.2016 / 17:16
4

Para fins de compatibilidade, use o formulário posix em vez de expansão:

for i in $(seq 1 10); do (./wait file$i &); done
    
por 23.03.2016 / 16:42
2

Você pode agrupar os comandos e colocar os comandos agrupados em segundo plano. Como:

$ for i in {1..10}; do ((wait file$i)&); done
    
por 23.03.2016 / 16:19
2

Seu binário é realmente denominado wait ? Eu não recomendo fazer isso, porque wait é um shell embutido.

Eu acredito que o bash não analisa bem um loop de uma linha que lança processos em segundo plano. Eu sugiro que você mude o código para:

$ for i in {1..10}; do ./wait file$i & echo "Running 'wait' using PID=$!..."; done
    
por 23.03.2016 / 16:25