Lệnh Ps và grep


8

Tại sao ps -ef | grep $$hiển thị greplệnh trong danh sách quy trình? Không phải là grepthực hiện sau khi psđã hoàn thành công việc của mình?


Nó được gọi là đường ống ...
Ipor Sircer

Nếu nó đợi cho đến khi lệnh đầu tiên kết thúc, làm thế nào các đường ống hoạt động với các lệnh không tự dừng lại, như thế tail -f filename | grep patternnào?
Barmar

Câu trả lời:


11

Khi các lệnh đường ống, tất cả các quy trình được bắt đầu cùng một lúc và chúng chỉ ngủ (chặn) cho đến khi I / O đi vào / thoát chúng. Shell không đệm đầu ra và giữ nó cho đến khi một quá trình hoàn thành và sau đó chuyển nó sang một quy trình khác.

Ví dụ:

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

Kết quả trong:

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

Bạn có thể thấy trạng thái của quá trình grep trong cây / Proc:

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

Bạn cũng có thể thấy rằng cả hai greps được kết nối với cùng một đường ống (id 57573438) và STDOUT ( 1) của quy trình đầu tiên được kết nối với STDIN ( 0) của quy trình thứ hai.

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

Mặc dù đó là một ví dụ phức tạp để nói rằng họ ngủ và sau đó đưa vào lệnh ngủ - sau đó khi nó nói rằng đó là lệnh ngủ của bạn chứ không phải là thứ được thực hiện bởi vỏ
barlop

Tôi chỉ cần đặt lệnh ngủ ở đó để giới thiệu một số độ trễ để tôi có thể nhìn xung quanh trên hệ thống. Lệnh ngủ không tác động đến grep phía sau nó, ngoại trừ việc grep không nhận được bất kỳ đầu vào nào. Nếu điều đó làm bạn hài lòng, bạn có thể làm điều tương tự với tar: $ tar -zcvf test.tgz /lib/ | grep foo | grep barvà sau đó kiểm tra grep:$ cat status Name: grep State: S (sleeping)
mtak

Đã chỉnh sửa nó, vì vậy nó rõ ràng hơn.
mtak
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.