ps命令和grep


Answers:


11

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

例如:

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

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

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

您还可以看到两个抓钩都连接到同一管道(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

这是一个复杂的示例,尽管要说他们睡觉,然后放入sleep命令“ cos,然后当它说sleep时,这是您的睡眠命令,而不是由shell执行的操作
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 '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.