
Выполнение ps aux
на tty1 не выводит Xorg в список процессов, но команды типа killall Xorg
работают нормально. Почему ps не выводит Xorg?
решение1
На самом деле командная строка процесса показывает 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
Интересно, pgrep Xorg
что возвращает тот же процесс:
$ pgrep Xorg -a
30664 /usr/bin/X -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
И что еще интереснее,расширяющийся pgrep
Критерии поиска тогда не работают:
$ pgrep Xorg -fa
$
Это потому чтоX
( /usr/bin/X
) — это оболочка, которая вызываетXorg
. Я верю (но не уверен), что это на самом делеexec
s, и поэтому командная строка, которая и ps
показывает, остается неизменной, а программа теперь другая. Это можно проверить, изучив каталог процесса /proc
:
$ sudo ls -l /proc/30664/exe
lrwxrwxrwx 1 root root 0 Jun 24 08:09 /proc/30664/exe -> /usr/bin/Xorg
Вот почему pgrep Xorg
и killall Xorg
работает, но pgrep -f Xorg
не удалось. pgrep -f
ищет командные строки, которые все еще показывают X
, а не Xorg
. Таким образом, действие, которое обычно должно возвращать лучшие результаты, на самом деле имеет худшие результаты.
Действительно, кажется, X
что да exec
. Использованиеэтот ТАК ответ:
$ nm -D /usr/bin/X | grep exec
U execv