Por que `ps -x | grep foo` inclui o comando grep?

Por que `ps -x | grep foo` inclui o comando grep?

eu sei que issofaz(frequentemente) inclui o processo grep e sei que adicionar | grep -v grepou usar o grep [f]ooirá impedi-lo, mas minha pergunta é mais sobre a ordem das operações, eu acho.

Por exemplo, neste exemplo inventado, vejo vários processos grep:

% ps -x | grep login | grep login | grep login | grep login
 2475 ??         0:00.03 /usr/libexec/loginitemregisterd
 2115 ttys004    0:00.04 login -fp jasonerickson
29715 ttys004    0:00.00 grep login
29716 ttys004    0:00.00 grep login
29717 ttys004    0:00.00 grep login
29718 ttys004    0:00.00 grep login

Isso me diz que ps -xdeve ser executadodurarnessa linha, pois lista todos os comandos grep subsequentes. No entanto, não é consistente. Às vezes ele lista 4 ou 3 ou 2 ou até mesmo nenhum dos processos grep. Isso implicaria para mim que não ésempredurar.

O que está acontecendo?

Responder1

Como destaca Bravo, um pipe no Linux não é um arquivo, é dinâmico. Então, ps -x | grep loginna verdade, iniciaremos os dois programas ao mesmo tempo, para que um possa cair no cano e o outro possa pegar. A razão pela qual não é determinista, pela qual seu exemplo inventado nem sempre mostra quatro grepinstâncias, é que uma instância não pode ser iniciada até que haja algo no canal para ela fazer; ou a instância em questão pode não estar totalmente iniciada ao psler a lista de processos.

Responder2

Unix é um sistema operacional multitarefa. Ele não inicia o ps primeiro ou por último. Ele inicia todas as coisas no pipeline em paralelo. Alguns podem terminar primeiro ou começar depois do início do ps, e é daí que vem a sua corrida, o que torna os resultados um pouco não determinísticos.

Basicamente, não há ordem de operações aqui. Um pipeline é um fluxo de dados, não uma fórmula matemática.

A beleza do pipe no Unix é que o segundo programa pode começar a processar a entrada antes que o primeiro programa termine e, portanto, não é necessário coletar e armazenar todo o fluxo de dados na memória (ou disco) antes de entregá-lo ao próximo. coisa no cano.

informação relacionada