Como fazer com que o pgrep exiba informações completas do processo

26

Existe alguma maneira de pgrepme dar todas as informações sobre cada processo que psfaz? Eu sei que posso pspassar, grepmas isso é muita digitação e também me dá o grepprocesso que eu não quero.

JoelFan
fonte

Respostas:

22

pgrepAs opções de saída do são bastante limitadas. Você quase certamente precisará enviá-lo de volta pspara obter as informações importantes. Você pode automatizar isso usando uma função bash no seu ~/.bashrc.

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

Em seguida, chame o comando com.

ppgrep <pattern>
Dan Carley
fonte
2
Obrigado! Eu a modifiquei para: function ppgrep() { pgrep "$@" | xargs ps fp 2> /dev/null; } Caso contrário, se nenhum processo corresponder à sua pesquisa, ele despeja toda uma psmegilla de uso.
JoelFan
No OS X, é psnecessário um hífen para os sinalizadores:function ppgrep() { pgrep "$@" | xargs ps -fp 2> /dev/null; }
Erik Nomitch 29/09
11
Se você quiser evitar a página de uso do ps, o GNU xargs tem uma opção, -rque somente executará o comando se tiver recebido uma lista.
Doug
11
ps fp $(pgrep -d, "$@")
Maneira
14

Combine pgrepcom o psuso xargs!

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

Por exemplo, tente

pgrep -u user | xargs ps -f -p

para obter uma lista completa de processos user.

É bom que você mantenha a primeira linha com os nomes das colunas. grepsempre descarta os nomes das colunas.

nalply
fonte
excelente! Isso resolve um problema estranho com o ArcGIS script de inicialização do servidor para xfvb
prusswan
Essa deve ser a resposta aceita, porque usa pipes unix de maneira adequada, pegando uma lista de PIDs de uma ferramenta e retornando para outra (se parece hackeamento, não é - essa técnica pode ser usada em MUITAS ferramentas UNIX ., como ferramentas e-mail grep a função ppgrep Bash () é uma dependência desnecessária e evita que confrontam a oportunidade de aprendizagem apresentado aqui).
Scott Prive
10

A seguir, você fornece apenas PID + linha de comando completa. Para "todas as informações ps", consulte outras respostas ...

A maioria dos linuxes usa procps-ng . Desde o 3.3.4 (lançado em 2012), pgrep -a( --list-full) mostra a linha de comando completa.
Nota: Por padrão, o pgrep corresponde apenas ao padrão fornecido com o nome do executável. Se você deseja comparar com a linha de comando completa (como grepping ps faz), adicione a opção -f( --full).

Nas versões mais antigas (incluindo o projeto procps original ), a -lopção mostrava informações, mas seu comportamento variava:

  • pgrep -fl combinou o padrão com a linha de comando completa e mostrou a linha de comando completa.
  • pgrep -lsozinho correspondia apenas ao nome do executável e mostrava apenas o nome do executável.
    Se você não quiser uma correspondência completa, não poderá ver a linha de comando completa :-( [ https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=526355#15 ]

Não tenho certeza de qual código o BSD usa, mas sua página de manual documenta o -flcomportamento antigo .

Infelizmente você não pode nem usar -flportável - nos procps-ng recentes, -f( --list-name) sempre imprime apenas o nome do executável.

Beni Cherniavsky-Paskin
fonte
4

Linux

Para a versão de GNU pgrepo -i(caso-insensibilidade) não é suportada, e comprida + saída distorcido é conseguido com -af.

$ pgrep -af apache

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

Página de manual :

   -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.

Mac OS

No OSX (e por inferência, no BSD) -l( saída longa ), em combinação com -f( correspondência com listas completas de argumentos ), será exibido o comando completo ( -iadiciona distinção entre maiúsculas e minúsculas):

$ pgrep -fil ssh

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

A página do manual :

 -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
fonte
1

Use a opção -v para grep - ele retorna tudo, exceto o padrão solicitado.

ps -ef | grep <process> | grep -v grep
Baumgart
fonte
Essa foi a melhor resposta para mim. Ele mostra o comando completo sem ser truncado, como acontece compgrep -u user | xargs ps -f -p
BringBackCommodore64
0

Eu não acho que exista, o máximo de informações que você pode obter é o nome e a identificação do processo usando a opção -l no pgrep.

O ps suporta todos os tipos de opções de formatação, por isso, basta criar um alias para o que você deseja salvar a digitação. Uma maneira simples de excluir o processo grep da saída é incluir um canal adicional grep -v greppara excluir qualquer processo grep.

Kyle Brandt
fonte
0

Para eliminar o grep processo, você pode usar colchetes como parte do seu padrão:

ps -ef | grep '[t]ty'

Você pode fazer isso com pse pgrep:

ps -fp $(pgrep -d, tty)
Pausado até novo aviso.
fonte
-1

Isso irá ajudá-lo, eu acho:

ps auxww

Blagoy Genadiev
fonte
2
Você pode por favor elaborar. Mais informações melhorariam esta resposta
Dave M