Comando pgrep: encontrar o PID pelo nome, a opção -f e a diferença entre pidof e pkill

Ambiente de testeFamília RHELAlmaLinux 9.8procps-ng 3.3conta rootDebian 12 · procps-ng 4.0.2 conta comum
Comandos de processos · agendamentopgrep, pidofLocalização/usr/bin/pgrep

Para encontrar o número (PID) de um processo em execução pelo nome, pela conta ou pela linha de comando, use o comando pgrep. Em um servidor AlmaLinux 9, copiamos o programa sleep com outros nomes, iniciamos três processos e comparamos os processos encontrados por cada opção. Na busca pelo nome saíram só esses três processos, e na busca em toda a linha de comando com -f saiu também o timeout que os iniciou.

As saídas abaixo vêm da conta root de um servidor AlmaLinux 9.8 e de uma conta comum de um servidor Debian 12. Os processos procurados são cópias do sleep com os nomes pgdemo-a e pgdemo-b, iniciadas com timeout 300 para terminarem sozinhas depois de 5 minutos. Os números de processo (PID) e o nome da conta do Debian (user1) foram trocados por valores de exemplo, e a versão do procps-ng no servidor AlmaLinux aparece só até a versão principal e secundária.

1️⃣ Uso básico do comando pgrep

  • ↪️ Encontrar o PID pelo nome e o código de saída

Se você escrever parte de um nome depois de pgrep, ele mostra os números dos processos cujo nome contém esses caracteres, um por linha. Na busca por pgdemo saíram três números: dois pgdemo-a e um pgdemo-b.

pgrep pgdemo
2143
2152
2155

Escrevendo o nome até pgdemo-a, sobraram só os dois pgdemo-a.

pgrep pgdemo-a
2143
2152

O texto procurado é lido como expressão regular estendida e, sem opções, a busca é feita só no nome do processo.

Se nenhum processo corresponder, ele termina sem mostrar nada, então confira o resultado pelo código de saída. Depois de procurar o nome inexistente pgdemo-zz, executar [echo $?] retornou 1.

pgrep pgdemo-zz
echo $?
1

Executando sem nenhuma condição, saiu o erro abaixo junto com o código de saída 2. A página man descreve os códigos de saída como 0 (encontrado), 1 (não encontrado), 2 (erro de sintaxe na linha de comando) e 3 (erro fatal, como falta de memória).

pgrep
pgrep: no matching criteria specified
Try `pgrep --help' for more information.
echo $?
2

Usando esse código de saída como condição em vez da saída, um script consegue verificar se um processo está em execução. A versão aparece com [pgrep -V]. O servidor Debian 12 tinha procps-ng 4.0.2 e o servidor AlmaLinux 9.8, procps-ng 3.3.

pgrep -V
pgrep from procps-ng 4.0.2

2️⃣ A opção pgrep -f e a saída de -l e -a

  • ↪️ Processos que também aparecem na busca em toda a linha de comando

Só pelo número não dá para saber qual é o processo, então mostre também o nome com -l ou toda a linha de comando com -a.

pgrep -l pgdemo
2143 pgdemo-a
2152 pgdemo-a
2155 pgdemo-b
pgrep -a pgdemo
2143 ./pgdemo-a 300
2152 ./pgdemo-a 301
2155 ./pgdemo-b 300

Os valores 300 e 301 no fim da saída de -a são os argumentos em segundos passados ao sleep. Com esses argumentos distinguimos os dois pgdemo-a de mesmo nome.

Com -f, a busca é feita em toda a linha de comando em vez do nome. Procurando pgdemo-a com -f, os números passaram de dois para quatro.

pgrep -f pgdemo-a
2141
2143
2150
2152

Acrescentando -a, vimos que as duas linhas a mais eram os timeout que receberam pgdemo-a como argumento. O nome deles é timeout, mas a linha de comando contém pgdemo-a, por isso atenderam à condição de -f.

pgrep -af pgdemo-a
2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 301

Ao usar -f dentro de um script, confira se o próprio script aparece no resultado. O pgrep nunca inclui a si mesmo no resultado, mas, se a linha de comando do script que executou o pgrep contiver o texto procurado, esse script também aparece.

Ao procurar pgdemo-a com chk.sh, um script que repassa o texto recebido sem mudanças para [pgrep -af], a última linha trouxe o próprio script: bash chk.sh pgdemo-a.

bash chk.sh pgdemo-a
2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 301
2160 bash chk.sh pgdemo-a

O padrão [p]gdemo-a, que coloca a primeira letra entre colchetes, encontra o mesmo texto que pgdemo-a como expressão regular, mas na linha de comando do script os colchetes aparecem como estão, então ela deixa de corresponder. Passando esse padrão ao mesmo script, a linha do script sumiu e ficaram só quatro linhas.

bash chk.sh '[p]gdemo-a'
2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 301

3️⃣ Opções de condição do pgrep

  • ↪️ -u por conta, -x nome exato, -n e -o, -c para contar

Com -x, o pgrep só encontra processos cujo nome inteiro é igual, e não uma parte. Com pgdemo não saiu nada, e com pgdemo-a saíram dois.

pgrep -x pgdemo
pgrep -lx pgdemo-a
2143 pgdemo-a
2152 pgdemo-a

-u filtra os processos pela conta que os iniciou. Se você escrever várias contas separadas por vírgulas, ele encontra todos os processos de qualquer uma delas. Os três processos iniciados como root saíram todos com [-u root], e com [-u daemon] não saiu nenhum.

pgrep -u root -l pgdemo
2143 pgdemo-a
2152 pgdemo-a
2155 pgdemo-b
pgrep -u daemon -l pgdemo
pgrep -u root,daemon -c pgdemo
3

Com uma conta que não existe, saiu o erro [invalid user name] junto com o código de saída 2.

pgrep -u no-such-user9 pgdemo
pgrep: invalid user name: no-such-user9

Na conta comum do servidor Debian 12 também encontramos, com as mesmas opções, o único sleep iniciado com essa conta.

pgrep -u user1 -l sleep
3047 sleep
pgrep -u user1 -a sleep
3047 sleep 60

Quando há vários processos com o mesmo nome, -n mostra só o iniciado mais recentemente e -o só o iniciado primeiro. Dos dois pgdemo-a iniciados com 2 segundos de intervalo, -n escolheu o mais novo e -o o mais antigo.

pgrep -n pgdemo-a
2152
pgrep -o pgdemo-a
2143

A página man diz que -n e -o não podem ser usadas juntas. Com as duas, saiu só o modo de uso, sem mensagem de erro.

-c mostra a quantidade em vez dos números. Se não encontrar nada, mostra 0 e o código de saída foi 1.

pgrep -c pgdemo
3
pgrep -c pgdemo-zz
0

Este é o resumo das opções do pgrep.

OpçãoCopiarDescrição
-f--fullProcurar em toda a linha de comando em vez do nome
-l--list-nameMostrar o nome junto com o número
-a--list-fullMostrar toda a linha de comando junto com o número
-x--exactEncontrar só processos cujo nome inteiro é igual
-u--euidSó processos iniciados pela conta indicada; com várias separadas por vírgulas, qualquer uma delas
-n--newestO iniciado mais recentemente entre os que correspondem
-o--oldestO iniciado primeiro entre os que correspondem
-c--countMostrar a quantidade em vez dos números; código de saída 1 se for 0
-d--delimiterDefinir o separador entre os números (quebra de linha por padrão)
-V--versionMostrar a versão
OpçãoCopiarDescrição
-i--ignore-caseProcurar sem diferenciar maiúsculas e minúsculas
-v--inverseEncontrar processos que não correspondem
-P--parentSó processos filhos do número de pai (PPID) indicado
-t--terminalSó processos ligados ao terminal indicado
-g--pgroupSó processos do número de grupo de processos indicado
-s--sessionSó processos do número de sessão indicado
-U--uidSó processos com o mesmo ID de usuário real
-G--groupSó processos com o mesmo ID de grupo real
-w--lightweightMostrar todos os números de thread em vez dos números de processo

🔲 Simulador do comando pgrep

O simulador abaixo começa com uma lista das seis linhas de pgdemo e timeout mais processos de exemplo. Toque nos chips para comparar na lista à esquerda as linhas que cada opção encontra, e veja com [pgrep -l pgdemo] como o resultado diminui depois de [pkill pgdemo-b].

Simulador do comando pgrepprocps-ng 3.3
[root@server work]#
Funciona só dentro do navegador. A lista à esquerda tem valores de exemplo, e ao lado das linhas que o pgrep encontra aparece [Just matched]. O [pkill] só simula apagando linhas da lista.

4️⃣ Diferença entre pgrep, pidof e pkill

  • ↪️ pidof procura o nome exato e pkill envia sinais

O pidof encontra, sem expressões regulares, só os processos cujo nome de programa inteiro é igual, e mostra os números em uma linha separados por espaços. Na busca por pgdemo-a saíram os dois números em uma linha, com o 2152, iniciado depois, na frente.

pidof pgdemo-a
2152 2143

Com o nome parcial pgdemo, ao contrário do pgrep, o pidof não encontrou nada, e o código de saída foi 1. Se você precisa de um só número, acrescente -s. [pidof -s pgdemo-a] mostrou só 2152.

pidof pgdemo
pidof -s pgdemo-a
2152

Para ver a hora de início e o número do pai (PPID) dos números encontrados, junte-os com vírgulas usando pgrep -d e passe-os para o -p do comando ps.

pgrep -d, pgdemo
2143,2152,2155
ps -fp $(pgrep -d, -x pgdemo-a)
UID          PID    PPID  C STIME TTY          TIME CMD
root        2143    2141  0 15:59 ?        00:00:00 ./pgdemo-a 300
root        2152    2150  0 15:59 ?        00:00:00 ./pgdemo-a 301

Os valores 2141 e 2150 na coluna PPID são os números dos timeout que iniciaram os dois pgdemo-a.

O pkill encontra processos com as mesmas condições do pgrep, mas, em vez de mostrar os números, envia um sinal a eles. Sem sinal indicado, envia SIGTERM, e você pode trocar o sinal como em [pkill -HUP nome].

O pkill envia o sinal assim que encontra uma correspondência, então confira primeiro os alvos com [pgrep -a] ou [pgrep -af] e as mesmas condições. Com -f, os timeout ou scripts cuja linha de comando contém o mesmo texto também viram alvos. Se você já sabe o número, envie o sinal só para esse número com o comando kill.

ComandoCritério de buscaSaídaTarefa
pgrepParte do nome (regex) ou, com -f, toda a linha de comandoNúmeros; nome e linha de comando com -l, -aSó procura
pidofNome inteiro do programaNúmeros em uma linhaSó procura
pkillMesmas condições do pgrepNenhumSinal aos processos encontrados (SIGTERM por padrão)

🔢 FAQ & conteúdo recomendado

O pgrep compara o nome do processo só até os 15 caracteres guardados em /proc/PID/stat. Se o nome tiver mais de 15 caracteres, procure com os primeiros 15 ou use -f para procurar em toda a linha de comando de /proc/PID/cmdline.

Ao filtrar a lista do ps com grep, a linha de comando desse grep também contém o nome procurado e pode aparecer no resultado. O pgrep nunca inclui a si mesmo no resultado e mostra só números, fáceis de passar para outros comandos.

Com -v, a condição é invertida e o pgrep encontra os processos que não correspondem. No pkill, a opção curta -v não pode ser usada, para evitar erros.

ℹ️ Aviso de afiliados
O conteúdo deste site contém links de afiliados. Quando um visitante compra um produto ou serviço por meio de um desses links, o site recebe uma comissão do vendedor. O valor que o comprador paga (em promoções, ele diminui ↓) não aumenta por causa disso. Preços, descontos e informações de estoque valem para o momento em que o texto foi escrito e podem ter mudado, por isso confirme com o vendedor antes de comprar. Os produtos são escolhidos e avaliados por critérios próprios, e o recebimento de comissão não influencia a ordem de apresentação nem o conteúdo das avaliações.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Demonstre sua humanidade: 7   +   3   =