Execute dois ou mais comandos simultaneamente em script de shell

Nov 28 2020

Geralmente é muito útil executar comandos em paralelo em um script de shell, mas não consigo encontrar maneiras de fazer isso. Isso é possível? Se sim, como eu faria isso? Estou interessado principalmente em fazer isso fish.

É útil quando estou executando comandos que demoram muito para serem concluídos, mas podem ou precisam ser executados ao mesmo tempo para diminuir o tempo que leva para terminar tudo.

Respostas

5 KamilMaciorowski Nov 28 2020 at 16:03

A abordagem mais básica é com &, esta outra resposta está certa. Ele também defende, nohupmas nohupredireciona stdin, stdout e stderr, algo que você pode ou não querer. Leia Diferença entre nohup, disowne& e tome uma decisão informada.

Outra abordagem é parallel. Será útil se os comandos que você deseja paralelizar forem semelhantes entre si e você puder criar um padrão.

A variante básica da ferramenta (de moreutils, pelo menos no Debian ) permite que você limite o número de trabalhos que são executados ao mesmo tempo. GNUparallel é mais avançado. Se as tarefas que você deseja executar geram saída, as seguintes opções serão particularmente úteis:

--group
Saída do grupo. A saída de cada trabalho é agrupada e impressa apenas quando o comando é concluído. Stdout (saída padrão) primeiro seguido por stderr (erro padrão). […]

( fonte )

( --groupé habilitado por padrão, então normalmente você não precisa usá-lo explicitamente.)

--keep-order
-k
Mantenha a sequência de saída igual à ordem de entrada. Normalmente, a saída de um trabalho será impressa assim que o trabalho for concluído. […] -kAfeta apenas a ordem em que a saída é impressa - não a ordem em que os trabalhos são executados.

( fonte )

Com eles, a saída de vários trabalhos será organizada, algo que você não pode obter &. Às vezes, você pode não se preocupar com a saída, mas ainda se preocupa com a sequência; como nesta minha resposta, onde o GNU parallelé usado para paralelizar vários curlprocessos e obter o status de saída de cada um, mantendo a sequência.

No Debian, o GNU parallelestá em um pacote chamado parallel. Como um executável separado, parallelpode ser executado em qualquer shell.

2 Giacomo1968 Nov 28 2020 at 11:12

A melhor maneira de fazer isso é combinar o nohupprefácio do comando com o &anexado ao final do comando

Não está claro qual é o seu objetivo principal, mas espero que ajude!

Para executar qualquer comando como um processo de segundo plano em uma máquina Linux, você deve preceder o comando nohupe anexar &ao final.

Portanto, o comando final seria:

nohup [your command] &

Os nohupmeios de comando deve ignorar “desliguem” eo comercial &anexado a ele é um comando que diz ao sistema para executar o comando como processo de fundo. Mais informações sobre seu uso podem ser encontradas aqui .

Quando você executa um comando como este, o processo é executado, você é enviado de volta ao prompt de comando e pode sair da sessão de terminal ou até mesmo ir e fazer algo não relacionado a esse comando durante essa sessão de terminal.