Se esperasse até o primeiro comando ser concluído, como os pipelines funcionariam com comandos que não param por conta própria, como tail -f filename | grep pattern?
Quando os comandos de canalização, todos os processos são iniciados ao mesmo tempo e apenas dormem (bloqueiam) até que a E / S entre / saia deles. O shell não armazena em buffer a saída e a mantém até que um processo seja concluído e depois a transfere para outro processo.
Por exemplo:
mtak@rubiks:~$ tar -zcvf test.tgz /lib/ | grep bla | grep foo | grep bar
Você pode ver o estado do processo grep na árvore / proc:
mtak@rubiks:~$ grep State /proc/28814/status
State: S (sleeping)
Você também pode ver que os dois greps estão conectados ao mesmo pipeline (id 57573438) e que o STDOUT ( 1) do primeiro processo está conectado ao STDIN ( 0) do segundo processo.
root@rubiks:~# ls -l /proc/28815/fd
total 0
lr-x------ 1 mtak mtak 64 dec 1 12:35 0 -> pipe:[57573437]
l-wx------ 1 mtak mtak 64 dec 1 12:35 1 -> pipe:[57573438]
lrwx------ 1 mtak mtak 64 dec 1 12:35 2 -> /dev/pts/17
root@rubiks:~# ls -l /proc/28816/fd
total 0
lr-x------ 1 mtak mtak 64 dec 1 12:35 0 -> pipe:[57573438]
lrwx------ 1 mtak mtak 64 dec 1 12:35 1 -> /dev/pts/17
lrwx------ 1 mtak mtak 64 dec 1 12:35 2 -> /dev/pts/17
é um exemplo um pouco complexo, porém, de dizer que eles dormem e depois colocar um comando de suspensão, porque quando diz que sono é o seu comando de suspensão, em vez de algo que está sendo feito pelo shell
barlop
Eu apenas coloquei o comando sleep para introduzir algum atraso para que eu pudesse dar uma olhada no sistema. O comando sleep não afeta o grep atrás dele, exceto que o grep não recebe nenhuma entrada. Se isso o deixa feliz, você pode fazer a mesma coisa com o tar: $ tar -zcvf test.tgz /lib/ | grep foo | grep bare depois verificar o grep:$ cat status Name: grep State: S (sleeping)
tail -f filename | grep pattern
?Respostas:
Quando os comandos de canalização, todos os processos são iniciados ao mesmo tempo e apenas dormem (bloqueiam) até que a E / S entre / saia deles. O shell não armazena em buffer a saída e a mantém até que um processo seja concluído e depois a transfere para outro processo.
Por exemplo:
Resulta em:
Você pode ver o estado do processo grep na árvore / proc:
Você também pode ver que os dois greps estão conectados ao mesmo pipeline (id
57573438
) e que o STDOUT (1
) do primeiro processo está conectado ao STDIN (0
) do segundo processo.fonte
$ tar -zcvf test.tgz /lib/ | grep foo | grep bar
e depois verificar o grep:$ cat status Name: grep State: S (sleeping)