Ps perintah dan grep

8

Mengapa ps -ef | grep $$menunjukkan grepperintah dalam daftar proses? Bukankah grepdieksekusi setelah isinya psselesai pekerjaannya?

Mulligan
sumber
Ini disebut pipa ...
Ipor Sircer
Jika menunggu sampai perintah pertama selesai, bagaimana pipa akan bekerja dengan perintah yang tidak berhenti dengan sendirinya, seperti tail -f filename | grep pattern?
Barmar
Duplikat lintas-situs Dalam urutan apa perintah pipa dijalankan?
Scott

Jawaban:

11

Saat pemipaan perintah, semua proses dimulai pada saat yang sama dan mereka hanya tidur (memblokir) sampai I / O masuk / keluar dari mereka. Shell tidak buffer output dan tahan sampai satu proses selesai dan kemudian transfer ke proses lain.

Sebagai contoh:

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

Hasil dalam:

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

Anda dapat melihat status proses grep di pohon / proc:

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

Anda juga dapat melihat bahwa kedua greps terhubung ke pipa yang sama (id 57573438) dan bahwa STDOUT ( 1) dari proses pertama terhubung ke STDIN ( 0) dari proses kedua.

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
mtak
sumber
itu adalah sedikit contoh kompleks untuk mengatakan bahwa mereka tidur dan kemudian dimasukkan ke dalam perintah tidur 'karena kemudian ketika dikatakan tidur itu perintah tidur Anda daripada sesuatu yang dilakukan oleh shell
barlop
Saya hanya menempatkan perintah tidur di sana untuk memperkenalkan beberapa penundaan sehingga saya bisa melihat-lihat sistem. Perintah sleep tidak memengaruhi grep di belakangnya, kecuali bahwa grep tidak menerima input apa pun. Jika itu membuat Anda bahagia, Anda dapat melakukan hal yang sama dengan tar: $ tar -zcvf test.tgz /lib/ | grep foo | grep bardan kemudian periksa grep:$ cat status Name: grep State: S (sleeping)
mtak
Sudah diedit, jadi lebih jelas.
mtak