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.


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.


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.


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

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.


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.


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

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)

Alguma explicação seria legal.
Davidbaumann

É basicamente o mesmo que a resposta aceita, mas com decoração diferente.
Scott
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.