Warum wird ps -ef | grep $$der grepBefehl in der Prozessliste angezeigt? Wird der nicht grephingerichtet, nachdem der psis seine Arbeit beendet hat?
tail -f filename | grep pattern.
Warum wird ps -ef | grep $$der grepBefehl in der Prozessliste angezeigt? Wird der nicht grephingerichtet, nachdem der psis seine Arbeit beendet hat?
tail -f filename | grep pattern.
Antworten:
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
$ tar -zcvf test.tgz /lib/ | grep foo | grep barund dann das grep überprüfen:$ cat status Name: grep State: S (sleeping)