Почему «ps aux | grep x "дают лучшие результаты, чем" pgrep x "?

68

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

pgrep php5

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

ps aux | grep php5

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

    
задан xczzhh 28.06.2012 в 11:43
источник

3 ответа

61

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
    
ответ дан izx 28.06.2012 в 12:00
источник
61

Команда 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
    
ответ дан jlliagre 09.09.2012 в 10:37
1
diff <(ps aux|grep x) <(pgrep x) # :)
    
ответ дан Thorsen 28.06.2012 в 12:09