男人pgrep
对选项说了以下几点-f
:
-f The pattern is normally only matched against the process name.
When -f is set, the full command line is used.
使用完整命令行是什么意思?
答案1
这意味着 without-f
只pgrep
在命令名称中搜索提供的正则表达式,而 with-f
它在其参数中搜索它(其中第一个参数 ( argv[0]
) 不一定与命令名称相同)。
$ sleep 2000 &
[1] 15768
$ pgrep 2000
$ pgrep -f 2000
15768
如果我们导致与使用's时的argv[0]
命令名称不同(在 Linux 上,如 中所示) :/proc/$pid/stat
zsh
ARGV0
$ 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
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 系统调用传递。按照惯例,该参数旨在告诉应用程序其名称,以使其知道如何相应地进行操作,因此通常就是进程名称的含义。在 Linux 上,它可以在 中找到
/proc/$pid/cmdline
,但进程也可以通过修改 指向的内存来更改它argv[0]
。
还应该指出的是,不同的 Unices 之间存在很多差异。
答案2
当您ps -f
将看到有关进程的更多详细信息,包括关联的命令和进程信息。当您使用或时pgrep -f
,它会搜索与您的查询相匹配的附加信息,而不是显示的信息ps
ps -e