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:
O
-v
switch grep reverte o resultado, excluindo-o da fila. Então faça assim:Upd . Você também pode usar o
-C
switch para especificar o nome do comando da seguinte maneira:Este último
-o
determina quais colunas da informação você deseja na listagem.pid
lista apenas a coluna de identificação do processo. E o sinal de igual=
depoispid
significa 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.
fonte
Você pode usar um truque de classe de personagem. "[d]" não corresponde a "[d]" apenas "d".
Eu prefiro isso a usar
| grep -v grep
.fonte
| grep -v grep
será mais fácil entender quando revisitar meu código."[d]" does not match "[d]" only "d"
?grep
comando não corresponda àps
linha de saída dogrep
próprio comando (o que tak chamou de "um segundo PID" na pergunta original). expressãoa[xy]d
que não coincidir com o textoa[xy]d
, mas ele faz texto de partidaaxd
ou de textoayd
. Portanto, a expressão[f]oo
corresponde ao texto,foo
mas não ao texto[f]oo
. Espero que esteja claro.Evite analisar
ps
a saída se houver alternativas mais confiáveis.fonte
pgrep
pesquisas por substring enquantopidof
por correspondência exata - exatamente o que eu precisava! obrigado!A
ps -C
opçã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 aux
fornecerá a lista completa de processos na maioria dos sistemas baseados em Unix eawk
é normalmente instalado por padrão.fonte
Use
pgrep
para procurar o pid de um processo pelo nome:Com nome de processo extra no resultado (
-l
):Procure e exiba o nome do processo (
-l
) e os argumentos (-f
):A coisa boa
pgrep
é que nunca se reportará como uma correspondência. Mas você não precisa obter o pidpgrep
e depois matar o processo correspondentekill
. Use empkill
vez disso:Especifique o
SIGKILL
sinal (-9
ou-KILL
) em vez deSIGTERM
(por padrão):Procure o nome do processo (
-l
) e os argumentos (-f
), solicite a confirmação (-I
) antes de eliminá-lo porSIGKILL
sinal (-9
ou-KILL
):Observe que a
-I
opção está disponível apenas em algumas versões dopkill
, por exemplo, no OS X Mavericks.fonte
Se você estiver usando o bash, também poderá fazer isso da seguinte maneira, usando o
ps -eaf
fonte
ps -eaf | grep "process_name" | awk '{print $2}'
esta linha devolve o pid (identificação do processo) excluindo "grep"
fonte