Как заставить pgrep отображать полную информацию о процессе

Вопрос или проблема

Существует ли способ получить от 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, это может сломать код, который полагается на синтаксис BSD pgrep.

Используйте опцию -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 из результата, можно воспользоваться одним из следующих способов:

  1. Частичный матч:
    Используйте квадратные скобки для задания регулярного выражения в grep:

    ps -ef | grep '[t]ty'
  2. Использование 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.

Оцените материал
Добавить комментарий

Капча загружается...