systemadmin.es » Utilidades » pkill y pgrep: Buscar o mandar señales por el nombre del proceso

pkill y pgrep: Buscar o mandar señales por el nombre del proceso

Mediante pkill y pgrep podemos mandar señales o obtener el PID de los procesos mediante su nombre.

No resulta extraño ver scripts que hacen un ps y mediante varias pipes buscar el nombre de un proceso para obtener su PID mediante awk. Un ejemplo sería:

# ps -fea | grep bpbackup | grep -v grep | awk '{ print $2 }'
8171

Mediante pgrep podemos hacer exactamente lo mismo sin tanta complicación:

# pgrep bpbackup
8171

No hace falta ni siquiera especificar el nombre completo del proceso, como haríamos con los greps. Por ejemplo, para buscar el PID del syslog o sysylog-ng independientemente, mediante pipes haríamos:

# ps -fea | grep syslog
root      6263     1  0 18:15 ?        00:00:00 /usr/sbin/syslog-ng
root      8618  8505  0 19:18 pts/0    00:00:00 grep syslog

Para el caso de pgrep sería exactamente equivalente:

# pgrep syslog
6263
# pgrep sys
6263
# pgrep sy
6263

Además permite otras muchas opciones, como por ejemplo buscar entre un conjunto de candidatos el proceso más nuevo o el más viejo. Por ejemplo, usando este conjunto de procesos de apache:

# ps -fea | grep httpd
apache    5501 15072  0 03:41 ?        00:01:09 /usr/local/bin/httpd -f /usr/local/etc/httpd.conf
apache   13073 15072  0 18:07 ?        00:00:08 /usr/local/bin/httpd -f /usr/local/etc/httpd.conf
apache   14698 15072  0 18:27 ?        00:00:07 /usr/local/bin/httpd -f /usr/local/etc/httpd.conf
root     15072  4274  0 Dec26 ?        00:00:06 /usr/local/bin/httpd -f /usr/local/etc/httpd.conf
apache   15433 15072  0 18:36 ?        00:00:08 /usr/local/bin/httpd -f /usr/local/etc/httpd.conf
apache   18240 15072  0 19:09 ?        00:00:04 /usr/local/bin/httpd -f /usr/local/etc/httpd.conf
apache   18242 15072  0 19:09 ?        00:00:02 /usr/local/bin/httpd -f /usr/local/etc/httpd.conf
apache   19757 15072  0 19:28 ?        00:00:00 /usr/local/bin/httpd -f /usr/local/etc/httpd.conf
apache   19758 15072  0 19:28 ?        00:00:00 /usr/local/bin/httpd -f /usr/local/etc/httpd.conf
apache   19759 15072  0 19:28 ?        00:00:00 /usr/local/bin/httpd -f /usr/local/etc/httpd.conf
root     19876 19772  0 19:29 pts/0    00:00:00 grep httpd
apache   24145 15072  0 13:55 ?        00:00:27 /usr/local/bin/httpd -f /usr/local/etc/httpd.conf

Obtenemos el siguiente listado con pgrep:

# pgrep httpd
5501
13073
14698
15072
15433
18240
18242
19757
19758
19759
24145

Podemos buscar cual es el proceso más viejo con el parámetro -o:

# pgrep -o httpd
15072

Y el más nuevo mediante el parámetro -n:

# pgrep -n httpd
19759

El caso de pkill funciona exactamente igual que pgrep, pero permite mandar señales a los procesos. Por ejemplo, para mandar un SUGHUP al syslog lo haríamos así:

# pkill -HUP syslog

Relacionados

Imprimir Imprimir

3 comments to “pkill y pgrep: Buscar o mandar señales por el nombre del proceso”

  1. Sólo añadir una cosa, lo de excluir el grep de la salida haciendo un |grep -v grep, es muy feo, se puede hacer así que queda mucho más limpio, pongo como ejemplo el primer comando que has puesto, quedaría así:

    # ps -fea | grep [b]pbackup | awk ‘{ print $2 }’

  2. ¿Que hace ps -fp $(pgrep bash)?

  3. Da los parámetros completos de los PID de bash:

    # ps -fp $(pgrep httpd)
    UID        PID  PPID  C STIME TTY      STAT   TIME CMD
    apache    5323 20173  0 18:08 ?        S      0:00 /usr/local/apache2/bin/httpd -DNO_DETACH -f /usr/local/apache2/conf/httpd.conf
    apache    6076 20173  0 18:10 ?        S      0:00 /usr/local/apache2/bin/httpd -DNO_DETACH -f /usr/local/apache2/conf/httpd.conf
    apache    6077 20173  0 18:10 ?        S      0:00 /usr/local/apache2/bin/httpd -DNO_DETACH -f /usr/local/apache2/conf/httpd.conf
    apache    6579 20173  0 18:10 ?        S      0:00 /usr/local/apache2/bin/httpd -DNO_DETACH -f /usr/local/apache2/conf/httpd.conf
    apache    8939 20173  0 18:11 ?        S      0:00 /usr/local/apache2/bin/httpd -DNO_DETACH -f /usr/local/apache2/conf/httpd.conf
    apache    8943 20173  0 18:11 ?        S      0:00 /usr/local/apache2/bin/httpd -DNO_DETACH -f /usr/local/apache2/conf/httpd.conf
    apache    8944 20173  0 18:11 ?        S      0:00 /usr/local/apache2/bin/httpd -DNO_DETACH -f /usr/local/apache2/conf/httpd.conf
    apache   10543 20173  0 18:12 ?        S      0:00 /usr/local/apache2/bin/httpd -DNO_DETACH -f /usr/local/apache2/conf/httpd.conf
    root     20173   959  0 Feb05 ?        Ss     0:02 /usr/local/apache2/bin/httpd -DNO_DETACH -f /usr/local/apache2/conf/httpd.conf
    apache   29103 20173  0 18:03 ?        S      0:00 /usr/local/apache2/bin/httpd -DNO_DETACH -f /usr/local/apache2/conf/httpd.conf
    apache   29515 20173  0 18:04 ?        S      0:00 /usr/local/apache2/bin/httpd -DNO_DETACH -f /usr/local/apache2/conf/httpd.conf
    

    Es similar a:

    # ps -fea | grep [h]ttpd
    apache    5323 20173  0 18:08 ?        00:00:00 /usr/local/apache2/bin/httpd -DNO_DETACH -f /usr/local/apache2/conf/httpd.conf
    apache    6076 20173  0 18:10 ?        00:00:00 /usr/local/apache2/bin/httpd -DNO_DETACH -f /usr/local/apache2/conf/httpd.conf
    apache    6077 20173  0 18:10 ?        00:00:00 /usr/local/apache2/bin/httpd -DNO_DETACH -f /usr/local/apache2/conf/httpd.conf
    apache    6579 20173  0 18:10 ?        00:00:00 /usr/local/apache2/bin/httpd -DNO_DETACH -f /usr/local/apache2/conf/httpd.conf
    apache    8939 20173  0 18:11 ?        00:00:00 /usr/local/apache2/bin/httpd -DNO_DETACH -f /usr/local/apache2/conf/httpd.conf
    apache    8943 20173  0 18:11 ?        00:00:00 /usr/local/apache2/bin/httpd -DNO_DETACH -f /usr/local/apache2/conf/httpd.conf
    apache    8944 20173  0 18:11 ?        00:00:00 /usr/local/apache2/bin/httpd -DNO_DETACH -f /usr/local/apache2/conf/httpd.conf
    apache   10543 20173  0 18:12 ?        00:00:00 /usr/local/apache2/bin/httpd -DNO_DETACH -f /usr/local/apache2/conf/httpd.conf
    root     20173   959  0 Feb05 ?        00:00:02 /usr/local/apache2/bin/httpd -DNO_DETACH -f /usr/local/apache2/conf/httpd.conf
    apache   29103 20173  0 18:03 ?        00:00:00 /usr/local/apache2/bin/httpd -DNO_DETACH -f /usr/local/apache2/conf/httpd.conf
    apache   29515 20173  0 18:04 ?        00:00:00 /usr/local/apache2/bin/httpd -DNO_DETACH -f /usr/local/apache2/conf/httpd.conf
    

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>