Commande ps et grep

8

Pourquoi ps -ef | grep $$affiche la grepcommande dans la liste des processus? N'est-il pas grepexécuté une fois que l' psIS a terminé son travail?

Mulligan
la source
Ça s'appelle pipeline ...
Ipor Sircer
Si elle attendait la fin de la première commande, comment les pipelines fonctionneraient-ils avec des commandes qui ne s'arrêtent pas d'elles-mêmes, comme tail -f filename | grep pattern?
Barmar

Réponses:

11

Lors du piping des commandes, tous les processus sont démarrés en même temps et ils ne font que dormir (bloquer) jusqu'à ce que les E / S les entrent / sortent. Le shell ne met pas en mémoire tampon la sortie et la garde jusqu'à ce qu'un processus soit terminé, puis la transfère à un autre processus.

Par exemple:

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

Résulte 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

Vous pouvez voir l'état du processus grep dans l'arborescence / proc:

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

Vous pouvez également voir que les deux greps sont connectés au même pipeline (id 57573438) et que le STDOUT ( 1) du premier processus est connecté au STDIN ( 0) du deuxième processus.

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
mtak
la source
c'est un peu un exemple complexe cependant de dire qu'ils dorment et ensuite de mettre une commande sleep 'cos puis quand il dit sleep c'est votre commande sleep plutôt que quelque chose qui est fait par le shell
barlop
Je viens de mettre la commande sleep là-dedans pour introduire un certain délai afin que je puisse regarder autour du système. La commande sleep n'a pas d'impact sur le grep derrière elle, sauf que le grep ne reçoit aucune entrée. Si cela vous rend heureux, vous pouvez faire la même chose avec tar: $ tar -zcvf test.tgz /lib/ | grep foo | grep barpuis vérifiez le grep:$ cat status Name: grep State: S (sleeping)
mtak
Je l'ai déjà édité, donc c'est plus clair.
mtak