Khi bạn thực hiện lệnh:
ps -ef | grep cron
vỏ bạn đang sử dụng
(... tôi giả bash trong trường hợp của bạn, do thuộc tính màu sắc của grep Tôi nghĩ bạn đang chạy một hệ thống gnu như một bản phân phối Linux, nhưng nó cũng giống nhau trên unix/shell khác ...)
sẽ thực hiện cuộc gọi pipe()
để tạo FIFO, sau đó nó sẽ fork()
(tạo bản sao đang chạy của chính nó). Điều này sẽ tạo ra một tiến trình con mới. Quy trình con mới được tạo ra này sẽ close()
bộ mô tả tệp đầu ra tiêu chuẩn của nó (fd 1) và đính kèm fd 1 vào bên ghi của đường ống được tạo bởi tiến trình cha (vỏ mà bạn đã thực hiện lệnh). Điều này là có thể bởi vì các syscall fork()
sẽ duy trì, đối với mỗi, một mô tả tập tin mở hợp lệ (các fd ống trong trường hợp này). Sau khi làm như vậy, bạn sẽ thấy exec()
lệnh đầu tiên (trong trường hợp của bạn) là ps
được tìm thấy trong biến môi trường PATH
của bạn. Với cuộc gọi exec()
, quá trình sẽ trở thành lệnh bạn đã thực hiện.
Vì vậy, bây giờ bạn có quy trình trình bao với một đứa trẻ, trong trường hợp của bạn, lệnh ps
có thuộc tính -ef
.
Tại thời điểm này, cha (vỏ) fork()
s lại. Quy trình con mới được tạo ra close()
s bộ mô tả tệp đầu vào tiêu chuẩn của nó (fd 0) và gắn fd 0 vào bên đọc của đường ống được tạo bởi tiến trình cha (vỏ mà bạn đã thi hành lệnh).
Sau khi thực hiện điều đó, exec()
lệnh đầu tiên (trong trường hợp của bạn) grep
được tìm thấy trong biến môi trường PATH của bạn.
Bây giờ bạn có quá trình shell với hai đứa con (đó là anh chị em ruột), nơi đầu tiên là các lệnh ps
với -ef
thuộc tính và điều thứ hai là lệnh grep
với thuộc tính cron
.Mặt đọc của đường ống được gắn vào STDIN
của lệnh grep
và mặt ghi được gắn vào STDOUT
của lệnh ps
: đầu ra tiêu chuẩn của lệnh ps
được đính kèm với đầu vào chuẩn của lệnh grep
.
Vì ps
được viết để gửi thông tin đầu ra tiêu chuẩn trên mỗi quy trình đang chạy, trong khi grep được ghi để nhập tiêu chuẩn đầu vào tiêu chuẩn phải khớp với mẫu nhất định, bạn sẽ có câu trả lời cho câu hỏi đầu tiên của mình:
- chạy shell:
ps -ef;
- vỏ chạy:
grep cron;
ps
gửi dữ liệu (mà thậm chí có chứa chuỗi "grep cron") để grep
grep
khớp với mẫu tìm kiếm của nó từ STDIN
và nó khớp với chuỗi "grep cron" vì thuộc tính "cron" bạn đã chuyển đến grep
: bạn đang hướng dẫn grep
để khớp với chuỗi "cron" và nó có nghĩa là "grep cron" là một chuỗi được trả về bởi ps
tại thời điểm grep
đã bắt đầu thực hiện.
Khi bạn thực hiện:
ps -ef | grep '[c]ron'
thuộc tính thông qua chỉ thị grep
để phù hợp với một cái gì đó có chứa "c" tiếp theo là "ron". Giống như ví dụ đầu tiên, nhưng trong trường hợp này nó sẽ phá vỡ chuỗi trận đấu trở lại bởi ps
vì:
- chạy shell:
ps -ef;
- vỏ chạy:
rep [c]ron;
ps
gửi dữ liệu (mà thậm chí chứa chuỗi grep [c]ron
) tới grep
grep
không khớp với mẫu tìm kiếm của nó từ stdin vì chuỗi chứa "c" theo sau "ron" không tìm thấy, nhưng đã tìm thấy chuỗi chứa "c" theo sau "] ron"
GNU grep
không có giới hạn đối sánh chuỗi và trên một số nền tảng (tôi nghĩ Solaris, HPUX, aix) giới hạn chuỗi được đưa ra bởi biến "$ COLUMN" hoặc chiều rộng màn hình của thiết bị đầu cuối.
Hy vọng phản hồi dài này sẽ làm rõ quy trình ống vỏ một chút.
TIP:
ps -ef | grep cron | grep -v grep
Bạn sẽ ngạc nhiên về kết quả của 'giấc ngủ 3 | ngủ 3 | sleep 3' ;-) – Alfe