Comando pgrep: buscar un PID por nombre, la opción -f y diferencias con pidof y pkill

Entorno de pruebaFamilia RHELAlmaLinux 9.8procps-ng 3.3Cuenta rootDebian 12 · procps-ng 4.0.2 cuenta normal
Comandos de procesos y programación de tareaspgrep, pidofUbicación/usr/bin/pgrep

Para buscar el número (PID) de un proceso en ejecución por su nombre, cuenta o línea de comandos, se usa el comando pgrep. En un servidor AlmaLinux 9 copiamos el programa sleep con otros nombres, iniciamos tres procesos y comparamos los que encontraba cada opción. Al buscar por nombre solo salieron esos tres procesos, y al buscar en toda la línea de comandos con -f también salió el timeout que los había lanzado.

La salida de abajo es el resultado de ejecutar los comandos con la cuenta root de un servidor AlmaLinux 9.8 y con una cuenta normal de un servidor Debian 12. Los procesos buscados son copias de sleep llamadas pgdemo-a y pgdemo-b, lanzadas con timeout 300 para que terminaran solas a los 5 minutos. Los números de proceso (PID) y el nombre de la cuenta de Debian (user1) se cambiaron por valores de ejemplo, y la versión de procps-ng del servidor AlmaLinux se indica solo hasta la versión mayor y menor.

1️⃣ Uso básico del comando pgrep

  • ↪️ Buscar un PID por nombre y el código de salida

Si escribes parte de un nombre después de pgrep, muestra los números de los procesos cuyo nombre contiene esas letras, uno por línea. Al buscar pgdemo salieron tres números: dos de pgdemo-a y uno de pgdemo-b.

pgrep pgdemo
2143
2152
2155

Al escribir el nombre hasta pgdemo-a solo quedaron los dos pgdemo-a.

pgrep pgdemo-a
2143
2152

El texto de búsqueda se lee como expresión regular extendida y, sin opciones, solo se busca en el nombre del proceso.

Si no hay ningún proceso que coincida, termina sin mostrar nada, así que el resultado se comprueba con el código de salida. Tras buscar el nombre inexistente pgdemo-zz, al ejecutar [echo $?] salió 1.

pgrep pgdemo-zz
echo $?
1

Al ejecutarlo sin ninguna condición salió el error de abajo junto con el código de salida 2. La página man describe los códigos de salida como 0 (encontrado), 1 (no encontrado), 2 (error de sintaxis en la línea de comandos) y 3 (error grave, como falta de memoria).

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

Si usas este código de salida como condición en lugar de la salida, un script puede comprobar si un proceso está en ejecución. La versión se consulta con [pgrep -V]. El servidor Debian 12 tenía procps-ng 4.0.2 y el servidor AlmaLinux 9.8, procps-ng 3.3.

pgrep -V
pgrep from procps-ng 4.0.2

2️⃣ La opción -f de pgrep y la salida de -l y -a

  • ↪️ Procesos que también salen al buscar en toda la línea de comandos

Con el número solo no se sabe qué proceso es, así que se muestra el nombre con -l o toda la línea de comandos con -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

Los 300 y 301 al final de la salida de -a son los argumentos en segundos que se pasaron a sleep. Con estos argumentos distinguimos los dos pgdemo-a que tienen el mismo nombre.

Con -f se busca en toda la línea de comandos en lugar del nombre. Al buscar pgdemo-a con -f, los números pasaron de dos a cuatro.

pgrep -f pgdemo-a
2141
2143
2150
2152

Al añadir también -a se vio que las dos líneas nuevas eran los timeout que recibieron pgdemo-a como argumento. Su nombre es timeout, pero su línea de comandos contiene pgdemo-a, así que cumplían la condición 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

Cuando uses -f dentro de un script, comprueba si el propio script aparece en el resultado. pgrep no se incluye a sí mismo en el resultado, pero si la línea de comandos del script que ejecutó pgrep contiene el texto buscado, ese script también aparece.

Al buscar pgdemo-a con chk.sh, un script que pasa tal cual el texto recibido a [pgrep -af], se añadió en la última línea el propio 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

El patrón [p]gdemo-a, que encierra la primera letra entre corchetes, encuentra el mismo texto que pgdemo-a como expresión regular, pero en la línea de comandos del script los corchetes aparecen tal cual, así que ya no cumple la condición. Al pasar este patrón al mismo script desapareció la línea del script y solo quedaron cuatro líneas.

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️⃣ Opciones de condición de pgrep

  • ↪️ -u por cuenta, -x nombre exacto, -n y -o, -c para contar

Con -x solo se buscan los procesos cuyo nombre completo coincide, no una parte. Con pgdemo no salió nada, y al buscar pgdemo-a salieron dos.

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

-u filtra por la cuenta que ejecutó el proceso. Si escribes varias cuentas separadas por comas, encuentra todos los procesos que pertenecen a cualquiera de ellas. Los tres procesos ejecutados como root salieron todos con [-u root], y con [-u daemon] no salió ninguno.

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

Al escribir una cuenta que no existe salió el error [invalid user name] junto con el código de salida 2.

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

En la cuenta normal del servidor Debian 12 también encontramos con las mismas opciones el único sleep lanzado con esa misma cuenta.

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

Cuando hay varios procesos con el mismo nombre, -n muestra solo el que se inició más recientemente y -o solo el que se inició primero. De los dos pgdemo-a lanzados con 2 segundos de diferencia, -n eligió el posterior y -o el anterior.

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

La página man indica que -n y -o no se pueden usar juntas. Al escribir las dos solo salió el modo de uso, sin mensaje de error.

-c muestra la cantidad en lugar de los números. Si no encuentra nada, muestra 0 y el código de salida fue 1.

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

Este es el resumen de las opciones de pgrep.

OpciónCopiarDescripción
-f--fullBuscar en toda la línea de comandos en lugar del nombre
-l--list-nameMostrar el nombre junto con el número
-a--list-fullMostrar toda la línea de comandos junto con el número
-x--exactBuscar solo procesos cuyo nombre completo coincide
-u--euidSolo procesos ejecutados por la cuenta indicada; con varias separadas por comas, cualquiera de ellas
-n--newestEl que se inició más recientemente entre los que coinciden
-o--oldestEl que se inició primero entre los que coinciden
-c--countMostrar la cantidad en lugar de los números; código de salida 1 si es 0
-d--delimiterIndicar el separador entre números (salto de línea por defecto)
-V--versionMostrar la versión
OpciónCopiarDescripción
-i--ignore-caseBuscar sin distinguir mayúsculas y minúsculas
-v--inverseBuscar procesos que no cumplen la condición
-P--parentSolo procesos hijos del número de padre (PPID) indicado
-t--terminalSolo procesos conectados a la terminal indicada
-g--pgroupSolo procesos del número de grupo de procesos indicado
-s--sessionSolo procesos del número de sesión indicado
-U--uidSolo procesos con el mismo ID de usuario real
-G--groupSolo procesos con el mismo ID de grupo real
-w--lightweightMostrar todos los números de hilo en lugar de los de proceso

🔲 Simulador del comando pgrep

El simulador de abajo empieza con una lista de las seis líneas de pgdemo y timeout más procesos de ejemplo. Pulsa los chips para comparar en la lista de la izquierda las líneas que encuentra cada opción, y comprueba con [pgrep -l pgdemo] cómo se reduce el resultado después de [pkill pgdemo-b].

Simulador del comando pgrepprocps-ng 3.3
[root@server work]#
Funciona solo dentro del navegador. La lista de la izquierda tiene valores de ejemplo, y junto a las líneas que encuentra pgrep aparece [Recién encontrado]. [pkill] solo simula borrando líneas de la lista.

4️⃣ Diferencias entre pgrep, pidof y pkill

  • ↪️ pidof busca el nombre exacto y pkill envía señales

pidof busca solo los procesos cuyo nombre de programa completo coincide, sin expresiones regulares, y muestra los números en una sola línea separados por espacios. Al buscar pgdemo-a salieron los dos números en una línea, y primero el 2152, que se inició después.

pidof pgdemo-a
2152 2143

Con el nombre parcial pgdemo, a diferencia de pgrep, no encontró nada y el código de salida fue 1. Si solo necesitas un número, añade -s. [pidof -s pgdemo-a] mostró solo 2152.

pidof pgdemo
pidof -s pgdemo-a
2152

Para ver la hora de inicio y el número del padre (PPID) de los números encontrados, únelos con comas usando pgrep -d y pásalos a -p del 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

Los 2141 y 2150 de la columna PPID son los números de los timeout que ejecutaron los dos pgdemo-a.

pkill busca procesos con las mismas condiciones que pgrep, pero en lugar de mostrar los números les envía una señal. Si no indicas la señal envía SIGTERM, y puedes cambiarla como en [pkill -HUP nombre].

pkill envía la señal en cuanto encuentra un proceso, así que comprueba primero los destinos con [pgrep -a] o [pgrep -af] y las mismas condiciones. Si buscas con -f, también entran como destino los timeout o scripts cuya línea de comandos contiene el mismo texto. Si ya conoces el número, envía la señal solo a ese número con el comando kill.

ComandoQué buscaSalidaTarea
pgrepParte del nombre (regex) o, con -f, toda la línea de comandosNúmeros; nombre y línea de comandos con -l, -aSolo busca
pidofNombre completo del programaNúmeros en una líneaSolo busca
pkillMismas condiciones que pgrepNingunoSeñal a los procesos encontrados (SIGTERM por defecto)

🔢 FAQ & contenido recomendado

pgrep solo compara el nombre del proceso hasta los 15 caracteres que guarda /proc/PID/stat. Si el nombre tiene más de 15 caracteres, busca con los primeros 15 o usa -f para buscar en toda la línea de comandos de /proc/PID/cmdline.

Si filtras la lista de ps con grep, la línea de comandos de ese grep también contiene el nombre que buscas, así que puede aparecer en el resultado. pgrep no se incluye a sí mismo en el resultado y solo muestra números, lo que facilita pasarlos a otros comandos.

Con -v se invierte la condición y se buscan los procesos que no la cumplen. En pkill no se puede usar la opción corta -v, para evitar errores.

ℹ️ Aviso de afiliados
El contenido de este sitio incluye enlaces de afiliado. Cuando un visitante compra un producto o servicio a través de uno de ellos, el sitio recibe una comisión del vendedor. El importe que paga el comprador(baja durante las promociones ↓)no aumenta. Los precios, descuentos y existencias publicados corresponden al momento de redacción y pueden variar, así que confírmalos con el vendedor antes de comprar. Los productos se eligen y evalúan con criterios propios, y las comisiones no influyen en el orden ni en el contenido de las reseñas.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Demuestra que eres humano: 4   +   4   =