Comando pgrep: buscar un PID por nombre, la opción -f y diferencias con pidof y pkill
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
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 pgdemo2143
2152
2155Al escribir el nombre hasta pgdemo-a solo quedaron los dos pgdemo-a.
pgrep pgdemo-a2143
2152El 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-zzecho $?1Al 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).
pgreppgrep: no matching criteria specified
Try `pgrep --help' for more information.echo $?2Si 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 -Vpgrep from procps-ng 4.0.22️⃣ La opción -f de pgrep y la salida de -l y -a
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 pgdemo2143 pgdemo-a
2152 pgdemo-a
2155 pgdemo-bpgrep -a pgdemo2143 ./pgdemo-a 300
2152 ./pgdemo-a 301
2155 ./pgdemo-b 300Los 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-a2141
2143
2150
2152Al 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-a2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 301Cuando 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-a2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 301
2160 bash chk.sh pgdemo-aEl 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 3013️⃣ Opciones de condición de pgrep
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 pgdemopgrep -lx pgdemo-a2143 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 pgdemo2143 pgdemo-a
2152 pgdemo-a
2155 pgdemo-bpgrep -u daemon -l pgdemopgrep -u root,daemon -c pgdemo3Al 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 pgdemopgrep: invalid user name: no-such-user9En 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 sleep3047 sleeppgrep -u user1 -a sleep3047 sleep 60Cuando 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-a2152pgrep -o pgdemo-a2143La 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 pgdemo3pgrep -c pgdemo-zz0Este es el resumen de las opciones de pgrep.
| Opción | Copiar | Descripción |
|---|---|---|
| -f--full | Buscar en toda la línea de comandos en lugar del nombre | |
| -l--list-name | Mostrar el nombre junto con el número | |
| -a--list-full | Mostrar toda la línea de comandos junto con el número | |
| -x--exact | Buscar solo procesos cuyo nombre completo coincide | |
| -u--euid | Solo procesos ejecutados por la cuenta indicada; con varias separadas por comas, cualquiera de ellas | |
| -n--newest | El que se inició más recientemente entre los que coinciden | |
| -o--oldest | El que se inició primero entre los que coinciden | |
| -c--count | Mostrar la cantidad en lugar de los números; código de salida 1 si es 0 | |
| -d--delimiter | Indicar el separador entre números (salto de línea por defecto) | |
| -V--version | Mostrar la versión |
| Opción | Copiar | Descripción |
|---|---|---|
| -i--ignore-case | Buscar sin distinguir mayúsculas y minúsculas | |
| -v--inverse | Buscar procesos que no cumplen la condición | |
| -P--parent | Solo procesos hijos del número de padre (PPID) indicado | |
| -t--terminal | Solo procesos conectados a la terminal indicada | |
| -g--pgroup | Solo procesos del número de grupo de procesos indicado | |
| -s--session | Solo procesos del número de sesión indicado | |
| -U--uid | Solo procesos con el mismo ID de usuario real | |
| -G--group | Solo procesos con el mismo ID de grupo real | |
| -w--lightweight | Mostrar 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].
4️⃣ Diferencias entre pgrep, pidof y pkill
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-a2152 2143Con 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 pgdemopidof -s pgdemo-a2152Para 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, pgdemo2143,2152,2155ps -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 301Los 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.
| Comando | Qué busca | Salida | Tarea |
|---|---|---|---|
| pgrep | Parte del nombre (regex) o, con -f, toda la línea de comandos | Números; nombre y línea de comandos con -l, -a | Solo busca |
| pidof | Nombre completo del programa | Números en una línea | Solo busca |
| pkill | Mismas condiciones que pgrep | Ninguno | Señal a los procesos encontrados (SIGTERM por defecto) |
🔢 FAQ & contenido recomendado
Comprobación en tiempo real
Comando top de Linux (ver el uso de CPU y memoria)
Comando que muestra en tiempo real cuánta CPU y memoria usa cada proceso.
Archivos abiertos
[Linux] Comando lsof: mostrar información de los archivos en uso
Comando que muestra los archivos que tiene abiertos un proceso, junto con su PID.
Control de trabajos
Segundo plano (Back Ground) y primer plano (Fore Ground) en Linux: controlar procesos
Método de control de trabajos para enviar un comando a segundo plano y volver a traerlo al primer plano.
ℹ️ 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.