Como obter apenas o usuário, o pid e o comando para executar um processo específico? (Ubuntu 11.10)

19

Quando eu ps -ef|grep pythonrecebo o seguinte:

myusername  4492  2994  0 10:32 pts/0    00:00:01 /home/myusername/.virtualenvs/myproject/bin/ipython manage.py runserver
root        6665     1  0 10:42 ?        00:00:00 /usr/bin/python /usr/lib/system-service/system-service-d
myusername 14051 13497  0 11:28 pts/7    00:00:00 grep --color=auto python

Como obtenho apenas o usuário que está executando o processo, o pid e o comando para o processo, como na saída a seguir?

myusername  4492 /home/myusername/.virtualenvs/myproject/bin/ipython manage.py runserver
root        6665 /usr/bin/python /usr/lib/system-service/system-service-d
Bentley4
fonte
Isto funciona? ps --fields="user pid command"
Pratnala
Não tentei. Encontrei na net. Não está perto de uma máquina Ubuntu agora. Desculpe. Verá mais tarde e que você saiba
pratnala
Não, eu recebo ERRO: Desconhecida opção de gnu long. Funciona para você?
Bentley4

Respostas:

13

Eu acho que você está procurando o argumento -o:

-o formato:

formato definido pelo usuário. formato é um argumento único na forma de uma lista separada por vírgula ou em branco, que oferece uma maneira de especificar colunas de saída individuais. As palavras-chave reconhecidas são descritas na seção ESPECIFICADORES DE FORMATO PADRÃO abaixo. Cabeçalhos podem ser renomeados (ps -o pid, ruser = RealUser -o comm = Command) conforme desejado. Se todos os cabeçalhos de coluna estiverem vazios (ps -o pid = -o comm =), a linha do cabeçalho não será exibida. A largura da coluna aumentará conforme necessário para cabeçalhos largos; isso pode ser usado para ampliar colunas como WCHAN (ps -o pid, wchan = WIDE-WCHAN-COLUMN -o comm). Também é oferecido controle explícito de largura (ps opid, wchan: 42, cmd). O comportamento de ps-pid = X, comm = Y varia de acordo com a personalidade; a saída pode ser uma coluna denominada "X, comm = Y" ou duas colunas denominadas "X" e "Y". Use várias opções -o em caso de dúvida. Use a variável de ambiente PS_FORMAT para especificar um padrão conforme desejado; DefSysV e DefBSD são macros que podem ser usadas para escolher as colunas padrão UNIX ou BSD.

Portanto, o comando que você deseja seria (Ubuntu):

ps -o uid,pid,cmd -ef|grep python

no OpenSolaris, o comando é:

ps -o ruser,pid,comm -ef|grep python
Simon
fonte
3
Isso realmente funciona para você? Quando eu executar esse comando eu receboWarning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
Bentley4
Sim, funciona para mim no ksh no OpenSolaris. A saída é como você deseja ... Verifique as páginas de manual do ps no seu sistema man ps. Talvez a sintaxe seja um pouco diferente no seu sistema.
19613 Simon
1
Mas o OP está em festa e não sobre ksh
pratnala
1
@ Bentley4 Se você quiser apenas o comando e não precisam de informações adicionais que você pode deixar cair o argumento -f e use o seguinte comando:ps -o uid,pid,cmd -e|grep python
Simon
1
@ Bentley4:ps -o user,pid,cmd -e|grep '[p]ython'
Simon
3

O mais simples provavelmente seria:

$ ps o uid=,pid=,cmd= -C python
1000 26126 python

Dessa forma, você obtém tudo diretamente pse não precisa analisar nada.

Na pspágina do manual:

-o formato

Formato definido pelo usuário. formato é um argumento único na forma de uma lista separada por vírgula ou em branco, que oferece uma maneira de especificar colunas de saída individuais. [...] Os cabeçalhos podem ser renomeados (ps -o pid, ruser = RealUser -o comm = Command) conforme desejado. Se todos os cabeçalhos de coluna estiverem vazios (ps -o pid = -o comm =), a linha do cabeçalho não será exibida.

-C cmdlist
     Select by command name.  This selects the processes whose executable 
     name is given in cmdlist.

A -Copção funcionará se você estiver executando pythoninterativamente, não se o python estiver executando um script. Nesse caso, você deve usar em seu -C scriptname.pylugar.

Terdon
fonte
1

Minha versão do PS é diferente, por isso pode exigir alguns ajustes, mas você pode usar o cut (e possivelmente tr dependendo do que você está tentando alcançar) - por exemplo, algo como

ps ef | cut -c1-16,50-   

Fornecerá os caracteres de 1 a 16 e 50 a partir de cada linha da sua declaração de ps. (Seus números reais provavelmente precisarão de um pouco de massagem).

Outra maneira de fazer isso (mas você perderá a formatação) pode ser

ps ef | tr-s "" | corte -f1,2,8- -d ""

O que comprimirá o espaço em branco no comando ps, depois pegará os campos 1,2 e 8 e os exibirá.

davidgo
fonte
Por apenas um processo, recebo meia página de informações em tela cheia com esses comandos. É bastante ilegível, estou 'massageando' os parâmetros, mas até agora não consegui obter nada remotamente do que quero.
Bentley4
1
ps -eo user,pid,cmd | grep [p]ython

Exemplo:

$ ps -eo user,pid,cmd | grep [p]ython
root      1056 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
root      1735 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
bmaupin  16613 /usr/bin/python3 /usr/share/system-config-printer/applet.py

Explicação:

  • -e todos os processos
  • -o formato definido pelo usuário
  • user,pid,cmd Mostrar usuário, ID do processo, colunas de comando

Nota: se você usar -fcom -ecomo outros têm sugerido, você pode obter erros. Isso ocorre porque esses dois parâmetros controlam o formato de saída e apenas um deles deve ser usado:

$ ps --help | grep -A 2 "output format"
*********** output format **********
-o,o user-defined  -f full
-j,j job control   s  signal
bmaupin
fonte