Dlaczego ps -ef | grep $$
pokazuje grep
polecenie na liście procesów? Czy grep
egzekucja nie jest wykonywana po ps
zakończeniu pracy?
tail -f filename | grep pattern
?
Dlaczego ps -ef | grep $$
pokazuje grep
polecenie na liście procesów? Czy grep
egzekucja nie jest wykonywana po ps
zakończeniu pracy?
tail -f filename | grep pattern
?
Odpowiedzi:
Podczas przesyłania komend wszystkie procesy są uruchamiane w tym samym czasie, a one po prostu śpią (blokują), aż wejdzie / wyjdzie z nich. Powłoka nie buforuje wyniku i nie zatrzymuje go, dopóki jeden proces nie zostanie zakończony, a następnie nie zostanie przeniesiony do innego procesu.
Na przykład:
mtak@rubiks:~$ tar -zcvf test.tgz /lib/ | grep bla | grep foo | grep bar
Prowadzi do:
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
Możesz zobaczyć stan procesu grep w drzewie / proc:
mtak@rubiks:~$ grep State /proc/28814/status
State: S (sleeping)
Możesz także zobaczyć, że oba greps są podłączone do tego samego potoku (id 57573438
) i że STDOUT ( 1
) pierwszego procesu jest podłączony do STDIN ( 0
) drugiego procesu.
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
a następnie sprawdź grep:$ cat status Name: grep State: S (sleeping)