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?
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
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)
tail -f filename | grep pattern
?Respuestas:
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:
Resultados en:
Puede ver el estado del proceso grep en el árbol / proc:
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.fuente
$ tar -zcvf test.tgz /lib/ | grep foo | grep bar
y luego verificar el grep:$ cat status Name: grep State: S (sleeping)