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?


Ç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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.