请解释 pgrep 中的 -f 选项

Gee*_*eek 5 command-line grep process command

男人pgrep说以下关于-f选项:

   -f     The  pattern  is normally only matched against the process name.
              When -f is set, the full command line is used.
Run Code Online (Sandbox Code Playgroud)

使用完整命令行是什么意思?

Sté*_*las 10

这意味着没有-f,pgrep仅在命令名称中搜索提供的正则表达式,而-f在其参数中搜索它(其中第一个参数 ( argv[0]) 不一定与命令名称相同)。

$ sleep 2000 &
[1] 15768
$ pgrep 2000
$ pgrep -f 2000
15768
Run Code Online (Sandbox Code Playgroud)

如果我们在使用's时导致argv[0]与命令名称不同(在 Linux 上,如 中所示/proc/$pid/stat):zshARGV0

$ ARGV0=foo sleep 2000 &
[2] 15881
$ ps -fp $!
UID        PID  PPID  C STIME TTY          TIME CMD
chazelas 15881 13126  0 19:55 pts/1    00:00:00 foo 2000
$ ps -o comm= $!
sleep
$ awk '{print $2}' /proc/$!/stat
(sleep)
$ pgrep foo
$ pgrep sleep
15881
$ pgrep -f sleep
$ pgrep -f foo
15881
Run Code Online (Sandbox Code Playgroud)

在 Unix 和 Linux 上有很多关于进程名称的潜在混淆。进程的 3 个属性可以声称是进程名称:

  • 传递给进程执行的最后一个 execve(2) 系统调用的可执行文件的基本名称。在Linux上,用来初始化进程名,如报告ps或发现/proc/$pid/stat。但是,应该注意的是,在 Linux 上,可以使用prctl(PR_SET_NAME...).
  • 当前mmap在进程中执行的可执行文件的任何路径,最好是调用时的路径(例如,对于脚本,这将是在 shebang 行中提供的路径)。在 Linux 上,您可以使用readlink或来获取它/proc/$pid/exe。那个,你不能在不调用另一个的情况下改变execve(尽管理论上你可以在内存中加载一个新的可执行文件并在不调用execve的情况下执行它的代码,例如查看用户土地 execve 的一些尝试)。
  • 第一个参数通过 execve 系统调用传递。按照惯例,该参数旨在告诉应用程序其名称以使其知道如何相应地进行操作,因此进程名称通常是什么意思。在 Linux 上,它可以在 中找到/proc/$pid/cmdline,但是一个进程也可以通过修改 指向的内存来改变它argv[0]。

还应该指出的是,Unices 之间的差异很大。