grep 入侵我的 ps

Eim*_*tas 5 osx grep process process-management

当我检查某个进程时,我通常会写

ps aux | grep myprocess
Run Code Online (Sandbox Code Playgroud)

有时我得到的输出

eimantas 11998  0.0  0.0   8816   740 pts/0    S+   07:45   0:00 grep myprocess
Run Code Online (Sandbox Code Playgroud)

如果进程没有运行。

现在我真的想知道如果 grep 在运行过滤掉ps命令的输出,为什么它会在进程列表中? ps

ale*_*ses 12

这种行为是完全正常的,这是由于 bash 管理管道使用的方式。

pipe 是由 bash 使用pipe系统调用实现的。在该调用之后,bash使用来自正确进程 ( )的输入分叉并替换标准输入(文件描述符 0grep)。主 bash 进程创建另一个 fork 并传递 fifo 的输出描述符代替标准输入(文件描述 1)并启动 left 命令。

ps实用程序在grep命令后启动,因此您可以在输出中看到它。

如果您不相信它,您可以使用set -x启用命令跟踪。例如:

+ ps aux
+ grep --color=auto grep
+ grep --color=auto systemd
alexises  1094  0.0  0.8   6212  2196 pts/0    S+   09:30   0:00 grep --color=auto systemd
Run Code Online (Sandbox Code Playgroud)

有关更多解释,您可以查看基本 c shell 的这一部分:http : //www.cs.loyola.edu/~jglenn/702/S2005/Examples/dup2.html


ton*_*ioc 8

当我只对进程的存在感兴趣时,我使用pgrepwhich 不显示此行为,例如:

$ pgrep myprocess
1900
Run Code Online (Sandbox Code Playgroud)

在其他情况下(当我对更多信息感兴趣时),我通常添加 a| grep -v grep来丢弃 grep 行,例如:

$ ps -ef | grep myprocess| grep -v grep
Run Code Online (Sandbox Code Playgroud)

  • 一个由来已久的技巧是“ps -ef|grep [m]yprocess” (2认同)

Cit*_*ght 6

pipe行为不像;. 它同时启动这两个过程。这就是grep命令也出现的原因。因此,当您给出 时ps aux | grep myprocessps aux包含grep myprocess,因此 grep 将其包含在其输出中。

为了检查这一点,我dd在我的测试服务器上给出了两个命令,如下所示:

[sreeraj@server ~]$ dd if=/dev/urandom of=/home/sreeraj/myfile1 bs=1M count=1024 | dd  if=/dev/urandom of=/home/sreeraj/myfile2 bs=1M count=1024
Run Code Online (Sandbox Code Playgroud)

当我检查该dd过程时,它显示它同时启动(查看显示 2:55 分钟已过去的列):

[sreeraj@server ~]$ ps aux | grep 'dd if'
sreeraj  14891  100  0.2   5376  1416 pts/0    R+   11:56   2:55 dd if=/dev/urandom of=/home/sreeraj/myfile1 bs=1M count=1024
sreeraj  14892  100  0.2   5376  1412 pts/0    R+   11:56   2:55 dd if=/dev/urandom of=/home/sreeraj/myfile2 bs=1M count=1024
sreeraj  14936  0.0  0.1   9032   672 pts/1    S+   11:59   0:00 grep --color=auto dd if
[sreeraj@server ~]$
Run Code Online (Sandbox Code Playgroud)

现在,如果您想从输出中排除 grep,请使用正则表达式。它将grep从结果中排除:

ps aux | grep "[m]yprocess"
Run Code Online (Sandbox Code Playgroud)

例如,如果您正在寻找 httpd 进程,请使用:

ps aux | grep "[h]ttpd"
Run Code Online (Sandbox Code Playgroud)

但我建议你使用pgrep -a,它会更可靠。

[sreeraj@server ~]$ pgrep -a httpd
8507 /usr/sbin/httpd -DFOREGROUND
8509 /usr/sbin/httpd -DFOREGROUND
8510 /usr/sbin/httpd -DFOREGROUND
8511 /usr/sbin/httpd -DFOREGROUND
8513 /usr/sbin/httpd -DFOREGROUND
8529 /usr/sbin/httpd -DFOREGROUND
[sreeraj@server ~]$
Run Code Online (Sandbox Code Playgroud)

  • `[my]process.` 将匹配 `mprocessX` 和 `yprocessY`(因为 `[my]` 是一个字符类,它匹配字母 `m` 或 `y`,而 `.` 匹配任何字符)。 (2认同)