进一步阅读

进一步阅读

为什么pgrep需要?如果我们可以一起使用psand grep,为什么我们还需要pgrep?如果我们有一个命令lsgrep或 ,那就很奇怪了curlgrep

但我注意到的一个区别是,如果我们首先使用以下命令启动 tmux 会话

tmux new -s foo

然后

ps aux | grep tmux

将无法找到 tmux 服务器进程,但是

pgrep -l tmux

能。但是,为什么我们没有一个 标志,ps以便我们grep能够pgrep看到 tmux 服务器进程呢?psgrep和有什么区别pgrep

答案1

ps命令有两个字段,通常,人们会以这种方式搜索,即argscomm。第一个是程序参数字符串,以 NUL 分隔。第二个是程序的“名称”。这些是单独存储的,并且(在各种操作系统上)可以两个都在运行时由程序本身更改。诸如此类的程序tmux确实做到了这一点。

的输出ps不可机器解析。多个字段可以包含未编码的空白这使得无法可靠地确定字段边界,因为任意长度的空白都是字段分隔符。 确实argscomm两个这样的领域。的输出ps仅是人类可读的。

因此,当您grep的输出ps是模式匹配整行时,没有可靠的方法将该模式锚定到相关的特定字段,除了通过消除几乎所有其他有用的东西,以及您可能首先尝试通过此方法找到的东西。

举些例子:

%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
%

进一步阅读

  • psNetBSD通用命令手册。 2016年12月2日。
  • visNetBSD 库函数手册。 2017年4月22日。
  • 什洛米·诺奇 (2009-10-01)。 如何不测试 mysqld 是否还活着。 code.openark.org。
  • 格雷格·伍利奇. 《解析进程树的风险》流程管理。格雷格的维基。
  • 乔纳森·德博因·波拉德 (2015)。clearenv小吃指南。软件。
  • 乔纳森·德博因·波拉德 (2015)。setenv小吃指南。软件。
  • 乔纳森·德博因·波拉德 (2020)。ps小吃指南。软件。
  • 乔纳森·德博因·波拉德 (2020)。list-process-table小吃指南。软件。

相关内容