Excluindo o grep da lista de processos

26

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

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

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

Eu testei algumas vezes e parece que o meu comando é sempre o segundo PID na lista, mas eu não quero pegar apenas o primeiro PID caso seja impreciso.

    
por tak 07.04.2012 / 14:12

6 respostas

26

A opção -v do grep inverte o resultado, excluindo-o da fila. Então faça como:

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

Atualizar . Você também pode usar a opção -C para especificar o nome do comando da seguinte forma:

ps -C daemon_name -o pid=

O último -o determina quais colunas da informação você deseja na listagem. pid lista apenas a coluna do ID do processo. E o sinal de igual = após pid significa que não haverá título de coluna para esse, então você obtém apenas os números claros - PIDs.

Espero que isso ajude.

    
por 07.04.2012 / 14:19
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 \ }"

Eu prefiro isso usando | grep -v grep .

    
por 07.04.2012 / 14:26
15

Evite analisar a saída de ps se houver alternativas mais confiáveis.

pgrep daemon_name
pidof daemon_name
    
por 07.04.2012 / 14:29
3

A opção ps -C não é universal em todos os sistemas baseados em Unix, mas se funciona nos seus sistemas. Em vez disso, eu evitaria totalmente o grep:

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

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

    
por 29.04.2013 / 04:52
3

Use pgrep para procurar o pid de um processo pelo nome:

pgrep proc_name

Com o nome do 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 sobre pgrep é que ele nunca se reportará como uma correspondência. Mas você não precisa obter o pid em pgrep e depois matar o processo correspondente em kill . Use pkill em vez disso:

pkill proc_name

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

pkill -9 proc_name

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

pkill -KILL -Ilf proc_name_or_argument

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

    
por 26.08.2014 / 03:21
0

Se você estiver usando bash, você também pode fazer isso da seguinte maneira, fazendo uso de ps -eaf

PIDS=$(ps -eaf)
PID=$(echo "$PIDS" | grep "process_name" | awk '{print $2}')
echo $PID
    
por 21.03.2017 / 10:19

Tags