Thời gian của ps đường ống đến grep


7

Vì vậy, đây không phải là một vấn đề như vậy, chỉ là điều tôi tò mò. Tôi đang sử dụng Linux Mint MATE được phân nhánh từ Debian. Nếu tôi làm:

ps afx  | grep abcdefg

Tôi có:

16599 pts/3    S+     0:00  |   \_ grep --color=auto abcdefg

Vì vậy, nó cho thấy quá trình cho grep. Nhưng, đó là của sau sự pstrong đường ống: Tôi đã có thể nghĩ rằng ở trên hiện ps, nhận được kết quả, và sau đó vượt qua họ grep. Vì vậy, làm thế nào đến greplà thực sự hiển thị trong pskết quả? Nó không xảy ra sau đó sao? Tôi nghĩ rằng tôi đang thiếu một cái gì đó cơ bản về những gì đường ống thực sự làm.

Câu trả lời:


4

Câu hỏi này là một bản sao và thuộc về unix.stackexchange.com.

Tóm lại, tài liệu Ngôn ngữ lệnh Shell của Opengroup tương đối mơ hồ về các chi tiết liên quan đến " đường ống ":

Đường ống là một chuỗi gồm một hoặc nhiều lệnh được phân tách bởi toán tử điều khiển '|'. Đầu ra tiêu chuẩn của tất cả trừ lệnh cuối cùng sẽ được kết nối với đầu vào tiêu chuẩn của lệnh tiếp theo.

Định dạng cho một đường ống là:

[!] command1 [ | command2 ...]

Đầu ra tiêu chuẩn của lệnh1 phải được kết nối với đầu vào tiêu chuẩn của lệnh2. Đầu vào tiêu chuẩn, đầu ra tiêu chuẩn hoặc cả hai lệnh sẽ được coi là được gán bởi đường ống trước khi bất kỳ chuyển hướng nào được chỉ định bởi các toán tử chuyển hướng là một phần của lệnh (xem Chuyển hướng).

Nếu đường ống không ở chế độ nền (xem Danh sách không đồng bộ), trình bao sẽ đợi lệnh cuối cùng được chỉ định trong đường ống hoàn thành và cũng có thể đợi tất cả các lệnh hoàn tất.

Lưu ý rằng trong khi dữ liệu rõ ràng chảy từ "trái sang phải" trong đường ống, không có gì đảm bảo về việc lập lịch trình.

Xem thêm:


2

Lập kế hoạch không quan trọng lắm. Nếu bạn xem xét đường ống một công việc dài một giờ, đường ống vẫn mở liên tục từ khi chương trình đầu tiên được bắt đầu cho đến khi nó kết thúc. Chương trình thứ hai chạy chính xác cùng thời gian với chương trình thứ nhất và cả hai kết thúc cùng một lúc (nói chung) ..

Nói cách khác, ps không nhận được đầu ra sau đó gửi nó đến grep - hai cái được chạy cùng một lúc và đầu ra của một được nhập vào thứ hai trong thời gian thực . Nó không đợi chương trình đầu tiên kết thúc, thu thập một giờ dữ liệu, sau đó gửi tất cả đến lần thứ hai trong một lần.

Mặc dù trong thực tế, có một số mức độ đệm (vài trăm ký tự) đặc biệt là khi có nhiều đường ống. Nhưng phần lớn, hãy nghĩ đến việc cả hai cùng chạy và nói chuyện trực tiếp với nhau.


cảm ơn - tôi đã lượm lặt được rằng từ câu trả lời cho câu hỏi này là một bản sao của :)
Max Williams

0

Tôi nghĩ rằng có một số thời gian liên quan ở đây.

mkfifo /tmp/pipe
echo  >/tmp/pipe

(quy trình vỏ được treo)

Nó không phải là vấn đề bắt đầu trước, bởi vì người viết sẽ chặn mọi cách cho đến khi người đọc mở kết thúc. Và vì vậy, vì thực tế, bất kỳ chương trình Unix lành mạnh nào cũng sẽ khởi tạo trước khi thấy bất cứ điều gì khác, pssẽ treo cho đến khi grepquá trình được thiết lập đủ ít nhất là để mở ở đầu đọc của ống đó.

cat </tmp/pipe &
echo >/tmp/pipe

(không treo lần này)

Thứ tự đó có nghĩa là bạn sẽ luôn luôn kết thúc grepở đó.

Có nhiều cách khác, mặc dù.

Ví dụ: nếu bạn đang tìm kiếm argv0 của một quy trình đang chạy với GNU ps, bạn có thể thực hiện:

ps -C argv0

Nếu bạn muốn sử dụng grep, điều đó hoàn toàn có thể thực hiện được, nhưng, được tìm kiếm lại argv0:

ps -eocomm= -opid=| grep ^argv0

... sẽ loại trừ các đối số của mỗi lệnh.

Và tất nhiên là có:

pgrep argv0
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.