Execute séries de comandos independentes uns dos outros

Execute séries de comandos independentes uns dos outros

Se eu tiver um arquivo com

cmd1

cmd2

cmd3

E eu quero executá-los independentemente um do outro, e independentemente de gerar um status de saída ou não (isso significa que não espere terminar, apenas continue iniciando processos, que podem falhar ou não. Eu sei que isso ;executaria o próximo comando, mas não é o caso, porque espera até que o comando anterior falhe ou seja bem-sucedido. Quero iniciar todos os comandos de uma vez.

É algo como sleep 60m; e depois tocar música, tocar uma campainha, rodar o navegador, mas obviamente, não há como esperar até que a música toque para tocar uma campainha, e depois disso rodar o navegador. Tem que acontecer de uma vez.

ADICIONADO: como, por exemplo,

ler as linhas do arquivo, abrir um terminal para cada linha e executá-lo?

Responder1

Simplesmente adicionar um E comercial ao final de cada linha irá bifurcar todos os comandos em segundo plano.

cmd1 &
cmd2 &
cmd3 &

Exemplo

$ more at_once.bash 
#!/bin/bash

echo "1" && sleep 10 &
echo "2" && sleep 10 &
echo "3" && sleep 10 &
pgrep -a sleep

Agora, quando executamos este script:

$ ./at_once.bash 
1
3
2
7533 sleep 10
7535 sleep 10
7536 sleep 10

Você pode até ver que as tarefas foram executadas fora de ordem devido à sua natureza em segundo plano, com o terceiro comando sendo repetido antes do segundo. O pgrep sleepmostra que todos os três comandos em segundo plano estão sendo executados ao mesmo tempo.

OBSERVAÇÃO:Usei a notação echo "X" && sleep 10simplesmente para mostrar que os comandos estavam sendo executados em segundo plano. Esta notação não tem nada a ver com o fundo em si, o rastro &é o que "coloca" os sleep 10comandos em segundo plano.

Você também pode usar &como separador se preferir fazer isso em uma única linha de comando:

$ sleep 10 & sleep 10 & sleep 10 &
[1] 7731
[2] 7732
[3] 7733

Verificando este forro:

$ pgrep -a sleep
7731 sleep 10
7732 sleep 10
7733 sleep 10

Novamente vemos todos eles funcionando simultaneamente. Se você usasse ponto e vírgula:

$ sleep 10 ; sleep 10 ; sleep 10

Os sleep 10comandos seriam executados em série, levando 30 segundos para serem concluídos, versus em paralelo, levando apenas 10 segundos.

informação relacionada