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
28. December 2008 at 10:31 pm :
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 }’
9. March 2010 at 5:09 pm :
¿Que hace ps -fp $(pgrep bash)?
9. March 2010 at 6:17 pm :
Da los parámetros completos de los PID de bash:
Es similar a: