Ответы:
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 корень 2805 0,0 0,5 95436 12204? S Jun24 0:00 / usr / bin / python / usr / lib / системный сервис / системный сервис-d izx 6272 0,0 2,9 664400 60320? SNl Jun24 1:16 / usr / bin / python / usr / bin / update-manager --no-focus-on-map корень 11729 0,0 0,9 180508 19516? S Jun25 0:00 python / usr / lib / software-properties / software-properties-dbus
pgrep python
возвращается только то 11729
, что вы увидите из приведенного выше списка:корень 11729 0,0 0,9 180508 19516? S Jun25 0:00 python / usr / lib / software-properties / software-properties-dbus
/proc/<pid>/stat
а не откуда/proc/<pid>/cmdline
. Хорошо, @Thorsen, вы выиграли спрей от ошибок, это ошибка: P
pgrep
не является необоснованной командой. Работает хорошо и как задумано. Проблема в том, что вы просто упустили опцию, когда запускаете ее, вы не можете винить pgrep
в этом. Использование ps aux | grep xxx
ненадежно, поэтому нужны хаки, чтобы отфильтровать grep
себя от вывода и может дать ложные срабатывания, как с ps aux | grep root
.
Команда 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
-a
( --list-full
), если вы хотите увидеть полную командную строку, а не только pid. (У старых pgrep не было -a
, делал это дальше-fl
.)
pgrep
играть, хорошее решение. +1
/proc/self/cmdline
чтобы быть «описательными», pgrep -fa ruby
не будут совпадать, например. puma 3.3.0 (tcp://localhost:3000) [MIQ: Web Server Worker]
пока "тупее" pgrep -a ruby
будет. Не уверен, что последний может быть обманут.
pgrep
и к ps
.
diff <(ps aux|grep x) <(pgrep x) # :)
В настоящее время ps
выдаст более полный вывод, чем pgep -f
pgrep, ограниченный первыми 4096 символами (что часто влияет на пользователей Java, которые ищут класс входа в программе Java с длинным путем к классу). Отслеживание ошибок это: https://gitlab.com/procps-ng/procps/issues/86