Xorg 没有出现在 ps aux 中?

use*_*607 3 xorg ps

这样做ps auxtty1上没有列出Xorg作为一个过程,但像命令killall Xorg做工精细。为什么ps不列出Xorg?

mur*_*uru 5

进程命令行实际上显示X,而不是Xorg

$ ps aux | grep -w X
muru     14702  0.0  0.0  15940   956 pts/6    S+   12:33   0:00 grep -w X
root     30664  1.9  1.6 690024 136632 tty7    Ssl+ Jun16 215:33 /usr/bin/X -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
$ pgrep X -a
30664 /usr/bin/X -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
Run Code Online (Sandbox Code Playgroud)

有趣的是,pgrep Xorg返回相同的过程:

$ pgrep Xorg -a
30664 /usr/bin/X -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
Run Code Online (Sandbox Code Playgroud)

更有趣的是,扩展 pgrep的搜索条件将无法正常工作:

$ pgrep Xorg -fa
$
Run Code Online (Sandbox Code Playgroud)

这是因为X( /usr/bin/X) 是调用Xorg. 我相信(但不确定)它实际上是execs,因此显示的命令行ps保持不变,程序现在不同了。这可以通过检查进程的/proc目录来验证:

$ sudo ls -l /proc/30664/exe 
lrwxrwxrwx 1 root root 0 Jun 24 08:09 /proc/30664/exe -> /usr/bin/Xorg
Run Code Online (Sandbox Code Playgroud)

这就是为什么pgrep Xorgkillall Xorg工作,但pgrep -f Xorg失败了。pgrep -f搜索命令行,仍然显示X,而不是Xorg。因此,通常应该返回更好结果的操作实际上会产生更差的结果。


确实,似乎X确实如此exec。使用这个 SO 答案

$ nm -D /usr/bin/X  | grep exec
                 U execv
Run Code Online (Sandbox Code Playgroud)