ps 命令和 grep

Mul*_*gan 8 linux shell

为什么在进程列表中ps -ef | grep $$显示grep命令?不是在完成他的工作grep后被执行ps吗?

mta*_*tak 11

当管道命令时,所有进程同时启动并且它们只是休眠(阻塞)直到 I/O 进入/退出它们。shell 不会缓冲输出并保持它直到一个进程完成然后将其传输到另一个进程。

例如:

mtak@rubiks:~$ tar -zcvf test.tgz /lib/ | grep bla | grep foo | grep bar
Run Code Online (Sandbox Code Playgroud)

结果是:

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
Run Code Online (Sandbox Code Playgroud)

可以在 /proc 树中看到 grep 进程的状态:

mtak@rubiks:~$ grep State /proc/28814/status
State:  S (sleeping)
Run Code Online (Sandbox Code Playgroud)

您还可以看到两个 grep 都连接到同一个管道 (id 57573438),并且1第一个进程的 STDOUT ( ) 连接到0第二个进程的 STDIN ( )。

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
Run Code Online (Sandbox Code Playgroud)