Вопрос или проблема
Существует ли способ получить от pgrep
всю информацию о каждом процессе, которую предоставляет ps
? Я знаю, что можно использовать ps
через grep
, но это много ввода, и это также возвращает процесс grep
сам по себе, что мне не нужно.
Опции вывода pgrep
довольно ограничены. Вам, скорее всего, придется вернуть результат через ps
, чтобы получить важную информацию. Вы можете автоматизировать это, используя функцию bash в вашем ~/.bashrc
.
function ppgrep() { pgrep "$@" | xargs --no-run-if-empty ps fp; }
Затем вызовите команду с параметром.
ppgrep <шаблон>
Комбинируйте pgrep
с ps
с использованием xargs
!
pgrep <ваши критерии pgrep> | xargs ps <ваши параметры ps> -p
Например, попробуйте
pgrep -u user | xargs ps -f -p
чтобы получить полный список процессов пользователя user
. Опция -u user
ограничивает pgrep
заданным пользователем (в виде числа или имени), в то время как параметры ps
-f -p
запрашивают полный формат списка для выбранного PID.
Хорошо, что вы сохраняете первую строку с названиями колонок. grep
всегда исключает названия колонок.
Следующий вывод показывает только PID + полную командную строку. Для “всей информации, которую дает ps
“, смотрите другие ответы…
Большинство систем Linux используют procps-ng. Начиная с версии 3.3.4 (выпущенной в 2012 году), pgrep -a
(--list-full
) показывает полную командную строку.
Примечание: По умолчанию pgrep
сопоставляет только заданный шаблон с именем выполняемого файла.
Если вы хотите сопоставить с полными командными строками (как это делает grep
для ps
), добавьте опцию -f
(--full
).
В старых версиях (включая оригинальный проект procps) опция -l
показывала информацию, но ее поведение варьировалось:
pgrep -fl
сопоставлял шаблон с полной командной строкой и показывал полную командную строку.pgrep -l
сама по себе сопоставляла только имя исполняемого файла и показывала только имя исполняемого файла.
Если вы не хотите полного совпадения, вы не можете увидеть полную командную строку 🙁
[https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=526355#15]
Не уверен, какой код используют *BSD, но их мануал документирует старое поведение -fl
.
К сожалению, вы не можете даже использовать -fl
переносимо – в недавнем procps-ng
-f
(--list-name
) всегда выводит только имя исполняемого файла.
Linux pgrep
Для GNU-версии pgrep
длинный + нечеткий вывод достигается с помощью -af
, и строка должна быть чувствительна к регистру (т.е. нет опции для нечувствительности к регистру).
$ pgrep -af apache
OUTPUT:
1748 /usr/sbin/apache2 -k start
-a, --list-full
Показывает полную командную строку, а также идентификатор процесса. (только pgrep
.)
-f, --full
Шаблон обычно сопоставляется только с именем процесса.
Когда установлено -f, используется полная командная строка.
MacOS/BSD pgrep
В MacOS/BSD -l
(длинный вывод) в комбинации с -f
(сопоставление с полными списками аргументов) отобразит полную команду (-i
добавляет нечувствительность к регистру):
$ /usr/bin/pgrep -fil ssh
OUTPUT:
33770 ssh: [email protected] [mux] t
-l Длинный вывод. Для pgrep, выводит
имя процесса в дополнение к
идентификатору процесса для каждого
совпадающего процесса. Если использовать в сочетании
с -f, выводит идентификатор процесса и
полный список аргументов для каждого
совпадающего процесса. Для pkill,
отображает команду завершения процесса для
каждого завершенного процесса.
❗️ПРИМЕЧАНИЕ: GNU
pgrep
можно установить на MacOS с помощьюbrew install pgrep
— это откроет GNU-версию по пути/usr/local/bin/pgrep
, и в зависимости от того, как вы определили$PATH
, это может сломать код, который полагается на синтаксис BSDpgrep
.
Используйте опцию -v для grep
– она возвращает всё, кроме заданного шаблона.
ps -ef | grep <процесс> | grep -v grep
Я знаю, что это старая тема. Тем не менее, она была полезной для меня, и я хотел бы поделиться тем, что я сделал и что сработало. Это довольно просто для новичка (как я) и может помочь другим:
[root@2a8ad900f55e tmp]# pgrep -f '(^|/)db2fmcd'|xargs ps |awk '{print $5}'
COMMAND
/opt/ibm/db2/V11.5/bin/db2fmcd
Обратите внимание, что колонка “CMD” также отображалась, но вопрос этой темы заключался в том, чтобы показать команду, а не только команду. В любом случае, я пытаюсь убрать эту колонку и обновлю свой пост с командой тоже.
Примечание:
Аргументы “–no-headers и -o command” изолировали вывод только для команды. И я мог бы убрать print awk.
[root@2a8ad900f55e tmp]# pgrep -f '(^|/)db2fmcd'|xargs ps -o command --no-headers
/opt/ibm/db2/V11.5/bin/db2fmcd
[root@2a8ad900f55e tmp]#
Я не думаю, что это возможно, наибольшую информацию, которую вы можете получить, это имя и идентификатор процесса, используя опцию -l для pgrep
.
ps
поддерживает всевозможные параметры форматирования, поэтому я просто создам псевдоним для того, что вам нужно, чтобы сохранить время ввода. Простой способ исключить процесс grep
из вывода — это добавить дополнительный конвейер с grep -v grep
, чтобы исключить любые процессы grep
.
Чтобы избежать появления процесса grep
, вы можете использовать квадратные скобки как часть вашего шаблона:
ps -ef | grep '[t]ty'
Вы можете сделать это с ps
и pgrep
:
ps -fp $(pgrep -d, tty)
Надеюсь, это поможет вам:
ps auxww
Ответ или решение
Чтобы получить полную информацию о процессах, аналогичную выводам команды ps
, можно использовать несколько подходов с использованием команды pgrep
в комбинации с ps
. Несмотря на то что pgrep
имеет ограниченные возможности вывода, его можно эффективно использовать вместе с другими утилитами для получения необходимой информации о процессах.
Использование функции в bash
Вы можете создать функцию в вашем файле ~/.bashrc
, чтобы упростить процесс. Это позволит вам вызывать короткую команду для получения полной информации.
function ppgrep() { pgrep "$@" | xargs --no-run-if-empty ps fp; }
После добавления этой функции в файл, выполните команду source ~/.bashrc
, чтобы обновить настройки. Теперь вы можете использовать:
ppgrep <шаблон>
Использование xargs
с pgrep
Другой способ получения полной информации о процессах — это использовать комбинацию pgrep
и xargs
с командой ps
. Например, чтобы отобразить полную информацию о процессах пользователя, можно выполнить следующую команду:
pgrep -u <имя_пользователя> | xargs ps -f -p
Здесь опция -u
ограничивает pgrep
по пользователю, а -f -p
предоставляет полный формат вывода для выбранных идентификаторов процессов.
Использование pgrep
с флагами
Для получения дополнительной информации можно использовать флаги -a
и -f
в pgrep
. Например, команда:
pgrep -af <ваш_шаблон>
Выдаст полный список идентификаторов процессов вместе с их полными командными строками. Однако следует помнить, что опция -f
делает поиск по всей командной строке, а не только по имени исполняемого файла.
Пример для MacOS и BSD
На MacOS и BSD можно использовать флаги -l
и -f
, чтобы получить полное имя процесса:
/usr/bin/pgrep -fil ssh
Это выведет идентификаторы процессов вместе с их полными аргументами.
Исключение процесса grep
Чтобы исключить процесс grep
из результата, можно воспользоваться одним из следующих способов:
-
Частичный матч:
Используйте квадратные скобки для задания регулярного выражения вgrep
:ps -ef | grep '[t]ty'
-
Использование
ps
сpgrep
:ps -fp $(pgrep -d, tty)
Это исполнит команду
ps
для всех процессов, идентификаторы которых получены с помощьюpgrep
.
Установка GNU pgrep на MacOS
На MacOS также доступна версия pgrep
из GNU, которая может быть установлена через Homebrew:
brew install pgrep
Имейте в виду, что это может изменить поведение стандартной команды pgrep
в зависимости от конфигурации $PATH
.
Заключение
Использование комбинации pgrep
с ps
или использование функции в bash — наиболее эффективные способы получения полной информации о процессах. Эти методы позволяют вам видеть все детали процессов, которые вы ищете, избегая необходимости вручную фильтровать вывод через grep
.