为什么pgrep
需要?如果我们可以一起使用ps
and grep
,为什么我们还需要pgrep
?如果我们有一个命令lsgrep
或 ,那就很奇怪了curlgrep
。
但我注意到的一个区别是,如果我们首先使用以下命令启动 tmux 会话
tmux new -s foo
然后
ps aux | grep tmux
将无法找到 tmux 服务器进程,但是
pgrep -l tmux
能。但是,为什么我们没有一个 标志,ps
以便我们grep
能够pgrep
看到 tmux 服务器进程呢?ps
和grep
和有什么区别pgrep
?
答案1
该ps
命令有两个字段,通常,人们会以这种方式搜索,即args
和comm
。第一个是程序参数字符串,以 NUL 分隔。第二个是程序的“名称”。这些是单独存储的,并且(在各种操作系统上)可以两个都在运行时由程序本身更改。诸如此类的程序tmux
确实做到了这一点。
的输出ps
是不可机器解析。多个字段可以包含未编码的空白这使得无法可靠地确定字段边界,因为任意长度的空白都是还字段分隔符。 确实args
是comm
两个这样的领域。的输出ps
仅是人类可读的。
因此,当您grep
的输出ps
是模式匹配整行时,没有可靠的方法将该模式锚定到相关的特定字段,除了通过消除几乎所有其他有用的东西,以及您可能首先尝试通过此方法找到的东西。
举些例子:
- 当您
u
选择 Linuxps
(在-u
BSD 中ps
)时,有一个user
包含用户名的字段,grep
查找程序名称的模式有时也会碰巧匹配。 - 规范问题(示例为“ps -ef | ps -ef 和有什么不一样? grep WDA 和 ps -ef | grep [W]DA?“,”匹配节目名,为什么点击率这么高?“,”`ps | 中第二个 grep 的功能grep -v | | grep -v | grep`“, 和许多其他地方)当然是传递给的模式
grep
与grep
进程自己的args
. - 它也可能恰好匹配环境字符串,考虑到经常在
_
环境变量中找到的内容,这一点尤其令人心酸。
%ps -a -x -e -o sid,comm,args | ps -a -x -e -o sid,comm,args | grep dbus 守护进程 | 头-n 4 25 nosh cyclog dbus-daemon/(nosh) 25 dbus-daemon dbus-daemon --config-file ./system-wide.conf --nofork --address=unix:path=/run/dbus/system_bus_socket 第989章 dbus-daemon --config-file ./per-user.conf --nofork --address=unix:path=/run/user/JdeBP/bus 15107 grep grep dbus 守护进程 % %clearenv --keep-path \ setenv WIBBLE tmux \ ps -a -x -e -o sid,comm,命令 | grep tmux 15107 ps PATH=/usr/local/bin:/usr/bin:/bin WIBBLE=tmux ps -a -x -e -o sid,pid,comm,命令 %
换句话说:grep
用于对包含行的文本文件进行操作。进程表不是文本文件,将其视为文本文件(通过使用命令对其进行翻译ps
)会丢失有关字段的信息。
执行此类搜索的方法是使用 以外的其他内容查看进程表ps
。在 Linux 上,可以直接查看/proc/${PID}/comm
参数字符串、环境字符串等的类似伪文件。
或者可以写一个工具来钓鱼需要匹配的具体数据从进程表中,并且仅在该字段上运行模式处理。该工具不适用于文本文件,而是用于流程表。可以称之为pgrep
。
当然,在紧握的手上可以写一个ps
其输出能处理(比如说)awk
,因为它是机器可读,对空白进行编码vis()
,从而提供awk
可以正确识别的字段。缺点是那就比较少了人类-可读,与符合规范的版本不太一样ps
。我将其输出传递过去console-flat-table-viewer
以进行读取。☺
%系统控制 ps -p 740 -o sid,comm,args SID 命令 命令 25 dbus-daemon dbus-daemon\040--config-file\040./system-wide.conf\040--nofork\040'--address=unix:path=/run/dbus/system_bus_socket' % %系统控制 ps -A -o sid,comm,args,envs,tree | awk '{ if ("dbus-daemon"==$2) print $3; }' dbus-daemon\040--config-file\040./system-wide.conf\040--nofork\040'--address=unix:path=/run/dbus/system_bus_socket' dbus-daemon\040--config-file\040./per-user.conf\040--nofork\040'--address=unix:path=/run/user/JdeBP/bus' /usr/local/bin/dbus-daemon\040--fork\040--print-pid\0405\040--print-address\0407\040--session % %系统控制 ps -A -o sid,comm,args,envs,tree | awk '{ if ("dbus-daemon"==$2) print $3; }' | 联合国维斯 dbus-daemon --config-file ./system-wide.conf --nofork '--address=unix:path=/run/dbus/system_bus_socket' dbus-daemon --config-file ./per-user.conf --nofork '--address=unix:path=/run/user/JdeBP/bus' /usr/local/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session %
进一步阅读
ps
。NetBSD通用命令手册。 2016年12月2日。vis
。NetBSD 库函数手册。 2017年4月22日。- 什洛米·诺奇 (2009-10-01)。 如何不测试 mysqld 是否还活着。 code.openark.org。
- 格雷格·伍利奇. 《解析进程树的风险》。流程管理。格雷格的维基。
- 乔纳森·德博因·波拉德 (2015)。
clearenv
。小吃指南。软件。 - 乔纳森·德博因·波拉德 (2015)。
setenv
。小吃指南。软件。 - 乔纳森·德博因·波拉德 (2020)。
ps
。小吃指南。软件。 - 乔纳森·德博因·波拉德 (2020)。
list-process-table
。小吃指南。软件。