Combina comandos paralelos e sequenciais

3

1. Resumo

Eu não entendo como posso combinar comandos paralelos e sequenciais no Linux.

2. Comportamento esperado

Pseudocódigo :

pip install pipenv sequencial pipenv install --dev

Tarefa

paralela

npm install -g grunt-cli sequencial npm install

Equivalente de trabalho em lotes do Windows :

start cmd /C "pip install pipenv & pipenv install --dev"
start cmd /C "npm install -g grunt-cli & npm install"

3. Não ajudou

  1. Eu não acho que & e wait possa resolver esse problema, consulte comentário do rsaw .
  2. Eu li que o paralelo da GNU - é o melhor caminho para tarefas paralelas , mas não consigo encontrar qual a sintaxe que preciso usar em < strong> GNU paralelo , que resolve esta tarefa.
  3. Eu tento parallelshell :

    parallelshell "pip install pipenv && pipenv install --dev" "npm install -g grunt-cli && npm install"
    

    Completamente .sh file:

    git clone --depth 1 https://github.com/Kristinita/KristinitaPelican
    wait
    cd KristinitaPelican
    wait
    parallelshell "pip install pipenv && pipenv install --dev" "npm install -g grunt-cli && npm install"
    

    Mas no primeiro comando pipenv install --dev executado para mim, então npm install . É sequencial, não paralelo.

por Саша Черных 01.03.2018 / 08:50

2 respostas

2

Simplesmente com o GNU parallel :

parallel ::: 'pip install pipenv && pipenv install --dev' \
             'npm install -g grunt-cli && npm install'
    
por 01.03.2018 / 09:50
2

O equivalente no estilo Unix dos seus comandos do Windows é o seguinte:

(pip install pipenv && pipenv install --dev) >& pip.log &
(npm install -g grunt-cli && npm install) >& npm.log &

Isso inicia duas sub-shells em segundo plano, uma executando pip seguido por pipenv (se pip concluir sem erro), a outra executando os dois comandos npm . Os dois conjuntos de saídas dos comandos são redirecionados para os arquivos de log, para manter as coisas inteligíveis.

Se você precisar esperar que todos esses comandos sejam concluídos antes de continuar, use

wait

como você já descobriu.

Ao sequenciar e fazer o paralelismo de tarefas usando um shell no estilo POSIX, existem duas ferramentas à sua disposição:

  • controle de tarefas, que permite colocar tarefas em segundo plano (usando & no final de um comando) e permite que você aguarde a conclusão delas (usando wait )
  • sub-shells, que permitem dividir unidades de processamento da maneira que você quiser, incluindo tarefas de serialização que precisam ser manipuladas sequencialmente.

Isso é bom o suficiente para requisitos simples, como sua tarefa atual, e pode levar você muito longe. Existem ferramentas mais avançadas para casos de uso mais complexos; O GNU Parallel é um deles, também vale a pena pesquisar em ferramentas de lotes se você precisar de um controle de recursos melhor.

    
por 01.03.2018 / 09:12