Execute dois ou mais comandos simultaneamente em script de shell
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
A abordagem mais básica é com &
, esta outra resposta está certa. Ele também defende, nohup
mas nohup
redireciona 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. […]-k
Afeta 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 curl
processos e obter o status de saída de cada um, mantendo a sequência.
No Debian, o GNU parallel
está em um pacote chamado parallel
. Como um executável separado, parallel
pode ser executado em qualquer shell.
A melhor maneira de fazer isso é combinar o nohup
prefá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 nohup
meios 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.