Os comandos em um pipeline são executados simultaneamente? [duplicado]

3

Em um pipeline como command1 | command2 ,

  • os comandos são executados simultaneamente (ou seja, têm o mesmo tempo de vida) ou
  • o comando2 inicia a execução no momento em que o comando1 sai ou
  • alguma outra coisa?

Minha pergunta surge quando soube que os processos dos comandos formam um grupo de processos. Se eles não tiverem o mesmo tempo de vida, o grupo de processos dos processos dos comandos não terá sentido?

    
por Tim 06.04.2015 / 02:56

2 respostas

5

Os processos são iniciados ao mesmo tempo e serão executados simultaneamente, mas eles não precisam parar ao mesmo tempo. O shell considerará que todo o pipeline foi encerrado (e exibirá um novo prompt) quando os processos ambos tiverem terminado.

Se command2 terminar antes de command1 (ou fechar seu fluxo de entrada padrão) e command1 tentar gravar a saída, não haverá nenhum lugar para essa saída. Então, command1 receberá um sinal SIGPIPE , cuja ação padrão é anular command1 . Mas o próprio command1 pode substituir esse padrão, de modo que ele continue a ser executado. Nesse caso, suas tentativas de gravar a saída produzirão um erro de E / S comum ( EPIPE ) ao qual ele pode reagir do modo que quiser.

    
por 06.04.2015 / 03:07
1

"|" 'AKA, "Pipes" .... permitem que você use a saída de um programa como entrada de outro ". Então, se vamos dizer que fazemos isso:

user$ cat SHAHashing.java | grep main
    public static void main(String[] args)throws Exception

como você pode ver o gato sendo executado primeiro exibindo o conteúdo da página "THE OUTPUT" e depois grep para a string principal.

Agora vamos supor que eu tenha digitado errado CAT assim:

user$ cats SHAHashing.java | grep main
-bash: cats: command not found

Nenhuma saída "comando errado", o grep será executado, mas sem nada a fazer. por isso ... cats causeed o primeiro comando a finalizar com o status "exit 1".

    
por 06.04.2015 / 03:33

Tags