Почему & ldquo; ps aux | grep x & rdquo; дать лучшие результаты, чем & ldquo; pgrep x & rdquo ;?

Я только что попробовал следующую команду в моем Ubuntu, она ничего не показывает:

pgrep php5

не должна она возвращать идентификатор процесса php5 (который следующая команда просто выполняет это??:

ps aux | grep php5

Итак, в чем разница между этими двумя командами?

82
задан 28 June 2012 в 14:12

5 ответов

Команда ps aux | grep x дает «лучшие» результаты, чем pgrep x, по сути, потому что у вас отсутствует опция с последним.

Просто используйте опцию -f для pgrep для поиска по полной командной строке, а не только по имени процесса, которое является его поведением по умолчанию, например:

pgrep -f php5

В отличие от конструкции ps | grep с который вы должны отфильтровать линию grep или использовать трюки с шаблонами, pgrep просто не выберет сам по себе.

Более того, если ваш шаблон появится в столбце ps USER, вы получите нежелательные процессы в выводе, pgrep не страдает от этого недостатка.

Если вам нужны полные детали, а не только pids, вы можете использовать:

ps wup $(pgrep -f python)

, что проще и надежнее, чем

ps aux | grep python | grep -v grep

или

ps aux | grep p[y]thon
0
ответ дан 28 June 2012 в 14:12
diff <(ps aux|grep x) <(pgrep x) # :)
0
ответ дан 28 June 2012 в 14:12

ps aux включает полную командную строку (путь и параметры), в то время как pgrep просматривает только первые 15 символов из имен исполняемого файла

ps aux возвращает полную командную строку каждого процесса, в то время как pgrep только смотрит на имена исполняемых файлов.

Это означает, что grepping выход ps aux будет соответствовать всему, что встречается в пути, или параметрам двоичного процесса: например, `

  • ps aux | grep php5 будет соответствовать /usr/share/php5/i-am-a-perl-script.pl
  • , но pgrep php5 не будет

Возьмем пример из моей системы - только мы Я буду использовать Python вместо php5:

  • ps aux | grep python дает нам:
izx       2348  0.0  0.7 514928 15644 ?        Sl   Jun24   0:00 /usr/bin/python /usr/lib/unity-lens-video/unity-lens-video
izx       2444  0.0  0.9 547392 18864 ?        Sl   Jun24   0:01 /usr/bin/python /usr/lib/unity-scope-video-remote/unity-scope-video-remote
root      2805  0.0  0.5  95436 12204 ?        S    Jun24   0:00 /usr/bin/python /usr/lib/system-service/system-service-d
izx       6272  0.0  2.9 664400 60320 ?        SNl  Jun24   1:16 /usr/bin/python /usr/bin/update-manager --no-focus-on-map
root     11729  0.0  0.9 180508 19516 ?        S    Jun25   0:00 python /usr/lib/software-properties/software-properties-dbus
  • Но pgrep python возвращает только 11729, который вы увидите из приведенного выше списка:
root     11729  0.0  0.9 180508 19516 ?        S    Jun25   0:00 python /usr/lib/software-properties/software-properties-dbus
0
ответ дан 28 June 2012 в 14:12

В это время, ps даст больше полного вывода, чем pgep -f, поскольку pgrep ограничен первыми 4 096 символами (часто влияющий на пользователей Java, ищущих класс записи программы Java с долгим путем к классу). Отслеживание ошибок это: https://gitlab.com/procps-ng/procps/issues/86

1
ответ дан 22 October 2019 в 10:06

Может и не лучше...когда я попытался найти серверный процесс tmux,

pgrep -l tmux

показал его, но

ps aux | grep tmux 

не покажет как сервер, а покажет как команду, которая инициировала запуск сервера. (tmux новый -s foo)

0
ответ дан 8 April 2020 в 16:31

Другие вопросы по тегам:

Похожие вопросы: