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, вы выиграли спрей от ошибок, это ошибка: Ppgrep
не является необоснованной командой. Работает хорошо и как задумано. Проблема в том, что вы просто упустили опцию, когда запускаете ее, вы не можете винитьpgrep
в этом. Использованиеps aux | grep xxx
ненадежно, поэтому нужны хаки, чтобы отфильтроватьgrep
себя от вывода и может дать ложные срабатывания, как сps aux | grep root
.Команда
ps aux | grep x
дает «лучшие» результаты, чем, поpgrep x
сути, потому что у вас отсутствует опция с последним.Просто используйте
-f
опцию дляpgrep
поиска по полной командной строке, а не только по имени процесса, которое является его поведением по умолчанию, например:В отличие от
ps | grep
конструкции, с которой вам нужно отфильтроватьgrep
линию или использовать трюки с шаблонами,pgrep
просто не выберете себя по дизайну.Более того, если ваш шаблон появится в
ps
USER
столбце, вы получите нежелательные процессы на выходе,pgrep
не страдающие этим недостатком.Если вы хотите получить полную информацию, а не только pids, вы можете использовать:
что проще и надежнее, чем
или же
источник
-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
.источник
В настоящее время
ps
выдаст более полный вывод, чемpgep -f
pgrep, ограниченный первыми 4096 символами (что часто влияет на пользователей Java, которые ищут класс входа в программе Java с длинным путем к классу). Отслеживание ошибок это: https://gitlab.com/procps-ng/procps/issues/86источник