Ps Befehl und grep

8

Warum wird ps -ef | grep $$der grepBefehl in der Prozessliste angezeigt? Wird der nicht grephingerichtet, nachdem der psis seine Arbeit beendet hat?

Mulligan
quelle
Es heißt Pipeline ...
Ipor Sircer
Wenn es warten würde, bis der erste Befehl beendet ist, wie würden Pipelines mit Befehlen funktionieren, die nicht von selbst anhalten, wie z tail -f filename | grep pattern.
Barmar

Antworten:

11

Bei Piping-Befehlen werden alle Prozesse gleichzeitig gestartet und sie werden nur in den Ruhezustand versetzt (blockiert), bis die E / A sie betreten / verlassen. Die Shell puffert die Ausgabe nicht und hält sie, bis ein Prozess abgeschlossen ist, und überträgt sie dann an einen anderen Prozess.

Zum Beispiel:

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

Ergebnisse in:

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

Sie können den Status des grep-Prozesses im / proc-Baum sehen:

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

Sie können auch sehen, dass beide Greps mit derselben Pipeline (ID 57573438) verbunden sind und dass STDOUT ( 1) des ersten Prozesses mit STDIN ( 0) des zweiten Prozesses verbunden ist.

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
quelle
Es ist jedoch ein komplexes Beispiel, zu sagen, dass sie schlafen und dann einen Schlafbefehl
einzugeben,
Ich habe einfach den Befehl sleep eingegeben, um eine Verzögerung einzuführen, damit ich mich im System umschauen kann. Der Befehl sleep wirkt sich nicht auf das dahinter stehende grep aus, außer dass das grep keine Eingabe erhält. Wenn es dich glücklich macht, kannst du dasselbe mit Teer machen: $ tar -zcvf test.tgz /lib/ | grep foo | grep barund dann das grep überprüfen:$ cat status Name: grep State: S (sleeping)
mtak
Es wurde bereits bearbeitet, daher ist es klarer.
Mtak