Как получить pgrep для отображения полной информации о процессе

27

Есть ли способ, чтобы pgrepдать мне всю информацию о каждом процессе, который psделает? Я знаю , что могу трубу psчерез , grepно это много печатать , и это также дает мне grepсам процесс , который я не хочу.

JoelFan
источник

Ответы:

22

pgrepПараметры вывода довольно ограничены. Вам почти наверняка потребуется отправить его обратно, psчтобы получить важную информацию. Вы можете автоматизировать это, используя функцию bash в вашем ~/.bashrc.

function ppgrep() { pgrep "$@" | xargs --no-run-if-empty ps fp; }

Затем вызовите команду с помощью.

ppgrep <pattern>
Дэн Карли
источник
2
Благодарность! Я изменил его на: function ppgrep() { pgrep "$@" | xargs ps fp 2> /dev/null; } В противном случае, если ни один из процессов не соответствует вашему поиску, он psвыдает целую мегиллу использования.
JoelFan
На OS X psнужен дефис для флагов:function ppgrep() { pgrep "$@" | xargs ps -fp 2> /dev/null; }
Эрик Номич
1
Если вы хотите избежать использования страницы ps, в GNU xargs есть опция, -rкоторая будет выполнять команду, только если она получила список.
Дуг
1
Более сжатый способps fp $(pgrep -d, "$@")
Игорь Микушкин
15

Объединить pgrepс psиспользованием xargs!

pgrep <your pgrep-criteria> | xargs ps <your ps options> -p

Например попробуйте

pgrep -u user | xargs ps -f -p

чтобы получить полный список процессов user.

Приятно, что вы сохраняете первую строку с именами столбцов. grepвсегда отбрасывает имена столбцов.

nalply
источник
превосходно! это решает странную проблему со скриптом запуска сервера arcgis для xfvb
prusswan
Это должен быть принятый ответ, потому что он должным образом использует каналы Unix, беря список PID из одного инструмента и возвращая их в другой (если это выглядит как хакерство, это не так - этот метод можно использовать в LOTS инструментов UNIX Как и инструменты электронной почты grep. Функция Bash ppgrep () является ненужной зависимостью и позволяет избежать возможности обучения, представленной здесь.)
Скотт Прайв,
Для объяснения параметров - -u= только сопоставлять процессы, чей эффективный идентификатор пользователя указан в списке (см. pgrepСсылку linux.die.net/man/1/pgrep ) -f= полный список форматов, -p= выбирать по PID (см. psСсылку - man7.org/linux/man -pages / man1 / ps.1.html )
Chris Halcrow
10

Следующее дает только PID + полная командная строка. Для "вся информация psделает", см. Другие ответы ...

Большинство linux использует procps-ng . Начиная с версии 3.3.4 (выпущена в 2012 году), pgrep -a( --list-full) показывает полную командную строку.
Примечание: по умолчанию pgrep соответствует только шаблону, который вы даете против имени исполняемого файла. Если вы хотите сопоставить с полной командной строкой (как это делает grepping 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) всегда печатает только имя исполняемого файла.

Бени Чернявский-Паскин
источник
4

Linux

Для версии ГНУ pgrepв -i(случай-нечувствительности) не поддерживается, и длинный + нечеткой выход достигается с -af.

$ pgrep -af apache

OUTPUT:
    1748 /usr/sbin/apache2 -k start

Man страница :

   -a, --list-full
       List  the  full  command line as well as the process ID.  (pgrep only.)

   -f, --full
       The pattern is normally only matched against the process name.  
       When -f is set, the full command  line is used.

MacOS

В OSX (и, как вывод, в BSD) -l( длинный вывод ) в сочетании с -f( сопоставление с полными списками аргументов ) будет отображаться полная команда ( -iдобавляет нечувствительность к регистру):

$ pgrep -fil ssh

OUTPUT:
    33770 ssh: abc@192.168.0.123-22 [mux] t

Страница man :

 -l          Long output.  For pgrep, print the
             process name in addition to the
             process ID for each matching
             process.  If used in conjunction
             with -f, print the process ID and
             the full argument list for each
             matching process.  For pkill, dis-
             play the kill command used for
             each process killed.
ccpizza
источник
1

Используйте параметр -v для grep - он возвращает все, НО запрошенный шаблон.

ps -ef | grep <process> | grep -v grep
Баумгарт
источник
Это был лучший ответ для меня. Он показывает вам полную команду без усечения, как это происходит сpgrep -u user | xargs ps -f -p
BringBackCommodore64
0

Я не думаю, что большинство информации, которую вы можете получить, это имя и идентификатор процесса, используя опцию -l для pgrep.

PS поддерживает все виды опций форматирования, поэтому я бы просто сделал псевдоним для того, что вы хотите сохранить при наборе текста. Простой способ исключить процесс grep из вывода - добавить дополнительную трубу, grep -v grepчтобы исключить любые процессы grep.

Кайл Брандт
источник
0

Чтобы исключить этот grepпроцесс, вы можете использовать скобки как часть вашего шаблона:

ps -ef | grep '[t]ty'

Вы можете сделать это с помощью psи pgrep:

ps -fp $(pgrep -d, tty)
Приостановлено до дальнейшего уведомления.
источник
-1

Это поможет вам, я думаю:

PS auxww

Благой Генадиев
источник
2
Можете ли вы уточнить, пожалуйста. Дополнительная информация могла бы улучшить этот ответ
Дэйв М,