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?
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
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)
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:
Résulte en:
Vous pouvez voir l'état du processus grep dans l'arborescence / proc:
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.la source
$ tar -zcvf test.tgz /lib/ | grep foo | grep bar
puis vérifiez le grep:$ cat status Name: grep State: S (sleeping)