Pourquoi ps -ef | grep $$
affiche la grep
commande dans la liste des processus? N'est-il pas grep
exécuté une fois que l' ps
IS a terminé son travail?
tail -f filename | grep pattern
?
Pourquoi ps -ef | grep $$
affiche la grep
commande dans la liste des processus? N'est-il pas grep
exécuté une fois que l' ps
IS a terminé son travail?
tail -f filename | grep pattern
?
Réponses:
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
$ tar -zcvf test.tgz /lib/ | grep foo | grep bar
puis vérifiez le grep:$ cat status Name: grep State: S (sleeping)