Como é possível executar vários comandos e colocá-los em segundo plano usando o bash?
Por exemplo:
$ for i in {1..10}; do wait file$i &; done
onde wait é um binário personalizado.
No 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.
nohup
o que lhe permite executar um comando em segundo plano&
e;
é "terminador de comando". Você não precisa usar os dois:for ...; do wait $arg & done
funcionará.Respostas:
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, nem precisacommand1 &; command2
, tudo o que precisa écommand1 & command2
.Então, no seu exemplo, você pode escrever:
e cada
wait
comando será iniciado em segundo plano e o loop passará imediatamente para o próximo.fonte
Por uma questão de compatibilidade, use o formulário posix em vez de expansão:
fonte
seq
não é um comando POSIX e geralmente é encontrado apenas em sistemas GNU. O comportamento ou$(...)
(e$i
) depende do valor atual de$IFS
. Observe também que, ao fazer(cmd &)
,cmd
será filho de um subshell, portanto você não poderá esperar e obter o status de saída, por exemplo.Você pode agrupar os comandos e colocar os comandos agrupados em segundo plano. Gostar :
fonte
Seu binário é mesmo nomeado
wait
? Eu não recomendo fazer isso, porquewait
é um shell embutido.Acredito que o bash não analisa bem um loop de uma linha que inicia processos em segundo plano. Eu sugiro que você altere o código para:
fonte