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 个属性可以声称是进程名称:
ps或发现/proc/$pid/stat。但是,应该注意的是,在 Linux 上,可以使用prctl(PR_SET_NAME...).mmap在进程中执行的可执行文件的任何路径,最好是调用时的路径(例如,对于脚本,这将是在 shebang 行中提供的路径)。在 Linux 上,您可以使用readlink或来获取它/proc/$pid/exe。那个,你不能在不调用另一个的情况下改变execve(尽管理论上你可以在内存中加载一个新的可执行文件并在不调用execve的情况下执行它的代码,例如查看用户土地 execve 的一些尝试)。/proc/$pid/cmdline,但是一个进程也可以通过修改 指向的内存来改变它argv[0]。还应该指出的是,Unices 之间的差异很大。