Excluindo grep da lista de processos

27

Eu criei um comando para retornar o ID do processo de um daemon em execução:

ps aux | grep daemon_name | awk "{ print \$2 }"

Funciona perfeitamente e retorna o PID, mas também retorna um segundo PID, que provavelmente é o processo que estou executando agora. Existe uma maneira de excluir meu comando da lista de PIDs retornados?

Testei-o algumas vezes e parece que meu comando é sempre o segundo PID da lista, mas não quero pegar apenas o primeiro PID, caso seja impreciso.

tak
fonte

Respostas:

27

O -vswitch grep reverte o resultado, excluindo-o da fila. Então faça assim:

ps aux | grep daemon_name | grep -v "grep daemon_name" | awk "{ print \$2 }"

Upd . Você também pode usar o -Cswitch para especificar o nome do comando da seguinte maneira:

ps -C daemon_name -o pid=

Este último -odetermina quais colunas da informação você deseja na listagem. pidlista apenas a coluna de identificação do processo. E o sinal de igual =depois pidsignifica que não haverá título de coluna para esse, então você obtém apenas os números claros - PIDs.

Espero que isto ajude.

Serg ikS
fonte
2
Usando "grep -v grep": Apenas observe que você pode ter uma longa linha de comando, incluindo "grep" (digamos que alguém tenha escrito uma biblioteca grep => "-Llibgrep.so" ou "-cp libgrep.jar". Pelo menos gostaria de repetir o padrão: grep -v "grep daemon_name"
phil_w
Bom ponto, @phil_w, obrigado. Atualizado a resposta.
Serg IKS
23

Você pode usar um truque de classe de personagem. "[d]" não corresponde a "[d]" apenas "d".

 ps aux | grep [d]aemon_name | awk "{ print \$2 }"

Eu prefiro isso a usar | grep -v grep.

RedGrittyBrick
fonte
Heh, isso é um truque inteligente, eu gosto. No momento, estou mantendo as coisas simples enquanto estou aprendendo e | grep -v grepserá mais fácil entender quando revisitar meu código.
58568 tak (
Eu estou tentando entender como isso [h] funciona. Poderia explicar o que você quer dizer com isso "[d]" does not match "[d]" only "d"?
Nowaker 28/09
@ Damian: Os colchetes são metacaracteres (delimitando um conjunto de caracteres) na expressão de pesquisa para que o grepcomando não corresponda à pslinha de saída do greppróprio comando (o que tak chamou de "um segundo PID" na pergunta original). expressão a[xy]dque não coincidir com o texto a[xy]d, mas ele faz texto de partida axdou de texto ayd. Portanto, a expressão [f]oocorresponde ao texto, foomas não ao texto [f]oo. Espero que esteja claro.
RedGrittyBrick 28/09
Ok, eu estava errado sobre ARGV. Este é apenas um regexp. Obrigado.
Nowaker 29/09
Diabolicamente inteligente! Tive que pensar por um momento - obrigado!
Subfuzion
15

Evite analisar psa saída se houver alternativas mais confiáveis.

pgrep daemon_name
pidof daemon_name
gravidade
fonte
Bem, finalmente, o gerenciamento de processos faz sentido agora.
Błażej Michalik
pgreppesquisas por substring enquanto pidofpor correspondência exata - exatamente o que eu precisava! obrigado!
21316 Sasha
3

A ps -Copção não é universal em todos os sistemas baseados em Unix, mas se funcionar em seus sistemas. Em vez disso, evitaria o grep:

ps aux | awk '/daemon_name/ && !/awk/ { print $2 }'

Não há necessidade de escapar de nada entre aspas simples. ps auxfornecerá a lista completa de processos na maioria dos sistemas baseados em Unix e awké normalmente instalado por padrão.

MOG73
fonte
3

Use pgreppara procurar o pid de um processo pelo nome:

pgrep proc_name

Com nome de processo extra no resultado ( -l):

pgrep -l proc_name

Procure e exiba o nome do processo ( -l) e os argumentos ( -f):

pgrep -lf proc_name_or_argument

A coisa boa pgrepé que nunca se reportará como uma correspondência. Mas você não precisa obter o pid pgrepe depois matar o processo correspondente kill. Use em pkillvez disso:

pkill proc_name

Especifique o SIGKILLsinal ( -9ou -KILL) em vez de SIGTERM(por padrão):

pkill -9 proc_name

Procure o nome do processo ( -l) e os argumentos ( -f), solicite a confirmação ( -I) antes de eliminá-lo por SIGKILLsinal ( -9ou -KILL):

pkill -KILL -Ilf proc_name_or_argument

Observe que a -Iopção está disponível apenas em algumas versões do pkill, por exemplo, no OS X Mavericks.

Rockallite
fonte
0

Se você estiver usando o bash, também poderá fazer isso da seguinte maneira, usando o ps -eaf

PIDS=$(ps -eaf)
PID=$(echo "$PIDS" | grep "process_name" | awk '{print $2}')
echo $PID
Shubham Khatri
fonte
Isso é desnecessariamente complexo. Por que não simplesmente chamar #ps -eaf | grep "process_name" | awk '{print $2}'
4114 David Nedrow
0

esta linha devolve o pid (identificação do processo) excluindo "grep"

PID=$(ps aux | grep '/usr/bin/python2.7 manage.py SES__boto3_sqs_read' | grep -v grep)
Brian Sanchez
fonte
Alguma explicação seria legal.
Davidbaumann
É basicamente o mesmo que a resposta aceita, mas com decoração diferente.
Scott