คำสั่ง Ps และ grep


8

เหตุใดจึงps -ef | grep $$แสดงgrepคำสั่งในรายการกระบวนการ การgrepประหารชีวิตpsของเขาไม่เสร็จหรือ


มันเรียกว่าไปป์ไลน์ ...
Ipor Sircer

หากรอจนกว่าคำสั่งแรกจะเสร็จสิ้นท่อจะทำงานกับคำสั่งที่ไม่หยุดด้วยตนเองได้tail -f filename | grep patternอย่างไร
Barmar

การทำสำเนาข้ามไซต์คำสั่ง piped ทำงานในลำดับใด
Scott

คำตอบ:


11

เมื่อไพพ์คำสั่งกระบวนการทั้งหมดจะเริ่มต้นในเวลาเดียวกันและพวกเขาก็หลับ (บล็อก) จนกว่า I / O เข้า / ออกจากพวกเขา เชลล์ไม่ได้บัฟเฟอร์เอาต์พุตค้างไว้จนกว่ากระบวนการหนึ่งจะเสร็จสิ้นแล้วโอนไปยังกระบวนการอื่น

ตัวอย่างเช่น:

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

ผลลัพธ์ใน:

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

คุณสามารถดูสถานะของกระบวนการ grep ได้ในแผนผัง / proc:

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

คุณยังสามารถเห็นว่า greps ทั้งสองเชื่อมต่อกับไปป์ไลน์เดียวกัน (id 57573438) และ STDOUT ( 1) ของกระบวนการแรกเชื่อมต่อกับ STDIN ( 0) ของกระบวนการที่สอง

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

มันเป็นตัวอย่างที่ซับซ้อนเล็กน้อยแม้ว่าจะบอกว่าพวกเขาหลับแล้วใส่คำสั่ง sleep 'เพราะเมื่อมันบอกว่า sleep มันเป็นคำสั่ง sleep ของคุณแทนที่จะเป็นสิ่งที่เชลล์ทำ
barlop

ฉันเพิ่งใส่คำสั่ง sleep ในนั้นเพื่อแนะนำการหน่วงเวลาบางอย่างเพื่อให้ฉันสามารถมองไปรอบ ๆ ระบบได้ คำสั่ง sleep ไม่ส่งผลกระทบต่อ grep ที่อยู่ด้านหลังยกเว้นว่า grep จะไม่ได้รับอินพุตใด ๆ ถ้ามันทำให้คุณมีความสุขคุณสามารถทำสิ่งเดียวกันกับ tar: $ tar -zcvf test.tgz /lib/ | grep foo | grep barจากนั้นตรวจสอบ grep:$ cat status Name: grep State: S (sleeping)
mtak

แก้ไขแล้วดังนั้นจึงชัดเจนยิ่งขึ้น
mtak
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.