
eu sei que issofaz(frequentemente) inclui o processo grep e sei que adicionar | grep -v grep
ou usar o grep [f]oo
irá 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 -x
deve 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 login
na 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 grep
instâ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 ps
ler 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.