comando Ps e grep

8

Por que ps -ef | grep $$ mostra o comando grep na lista de processos? Não é o grep executado após o ps terminar seu trabalho?

    
por Mulligan 01.12.2016 / 12:24

1 resposta

11

Quando comandos de tubulação, todos os processos são iniciados ao mesmo tempo e eles apenas param (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, em seguida, transfere-o para outro processo.

Por exemplo:

mtak@rubiks:~$ tar -zcvf test.tgz /lib/ | grep bla | grep foo | grep bar

Resultados em:

mtak 28813 28799  0 12:35 pts/17   00:00:00 tar -zcvf test.tgz /lib/
mtak 28814 28799  0 12:35 pts/17   00:00:00 grep --color=auto bla
mtak 28815 28799  0 12:35 pts/17   00:00:00 grep --color=auto foo
mtak 28816 28799  0 12:35 pts/17   00:00:00 grep --color=auto bar

Você pode ver o estado do processo do grep na árvore / proc:

mtak@rubiks:~$ grep State /proc/28814/status
State:  S (sleeping)

Você também pode ver que ambos os 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
    
por 01.12.2016 / 12:38

Tags