Я только что попробовал следующую команду в моем Ubuntu, она ничего не показывает:
pgrep php5
не должна она возвращать идентификатор процесса php5 (который следующая команда просто выполняет это??:
ps aux | grep php5
Итак, в чем разница между этими двумя командами?
Команда 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
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
В это время, ps
даст больше полного вывода, чем pgep -f
, поскольку pgrep ограничен первыми 4 096 символами (часто влияющий на пользователей Java, ищущих класс записи программы Java с долгим путем к классу). Отслеживание ошибок это: https://gitlab.com/procps-ng/procps/issues/86
Может и не лучше...когда я попытался найти серверный процесс tmux,
pgrep -l tmux
показал его, но
ps aux | grep tmux
не покажет как сервер, а покажет как команду, которая инициировала запуск сервера. (tmux новый -s foo
)