Ps comando y grep


8

¿Por qué ps -ef | grep $$muestra el grepcomando en la lista de procesos? ¿No se grepejecuta después de que el psha terminado su trabajo?


Se llama tubería ...
Ipor Sircer,

Si esperaba hasta que se terminara el primer comando, ¿cómo funcionarían las tuberías con comandos que no se detienen por sí solos tail -f filename | grep pattern?
Barmar

Respuestas:


11

Cuando se canalizan comandos, todos los procesos se inician al mismo tiempo y simplemente se suspenden (bloquean) hasta que las E / S ingresan / salen de ellos. El shell no almacena el resultado en el búfer y lo retiene hasta que un proceso se haya completado y luego lo transfiere a otro proceso.

Por ejemplo:

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

Resultados en:

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

Puede ver el estado del proceso grep en el árbol / proc:

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

También puede ver que ambos greps están conectados a la misma tubería (id 57573438) y que el STDOUT ( 1) del primer proceso está conectado al STDIN ( 0) del segundo proceso.

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

es un ejemplo un poco complejo decir que duermen y luego poner un comando de sueño porque cuando dice dormir es su comando de sueño en lugar de algo que está haciendo el shell
barlop

Acabo de poner el comando de suspensión allí para introducir un retraso y poder mirar alrededor del sistema. El comando de suspensión no afecta el grep detrás de él, excepto que el grep no recibe ninguna entrada. Si te hace feliz, puedes hacer lo mismo con alquitrán: $ tar -zcvf test.tgz /lib/ | grep foo | grep bary luego verificar el grep:$ cat status Name: grep State: S (sleeping)
mtak

Ya lo edité, por lo que está más claro.
mtak
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.