¿Por qué es pgrep
necesario? Si podemos usar ps
y grep
juntos, ¿por qué lo necesitamos pgrep
? Sería extraño si tuviéramos un comando lsgrep
o curlgrep
.
Pero una diferencia que noté fue que si primero iniciamos una sesión tmux con
tmux new -s foo
entonces
ps aux | grep tmux
no podrá encontrar el proceso del servidor tmux, pero
pgrep -l tmux
poder. Pero aún así, ¿por qué no tenemos una bandera ps
para que nos grep
guste pgrep
para poder ver el proceso del servidor tmux? ¿Cuáles son las diferencias entre ps
con grep
y pgrep
?
Respuesta1
El ps
comando tiene dos campos que, generalmente, se busca de esta forma, el args
y el comm
. La primera es la cadena de argumentos del programa, delimitada por NUL. El segundo es un "nombre" del programa. Estos se almacenan por separado y (en varios sistemas operativos) puedenambosser alterado por el propio programa, en tiempo de ejecución. Programas como este tmux
realmente hacen eso.
La salida de ps
esno analizable por máquina. Varios campos pueden contenerespacios en blanco sin codificarlo que hace imposible determinar los límites del campo de manera confiable, porque los espacios en blanco de longitud arbitraria sontambiénel separador de campos. args
y comm
de hecho son dos de esos campos. La salida de ps
es sólo legible por humanos.
Por lo tanto , cuando grep
el resultado ps
es un patrón que coincide con líneas enteras, sin una forma confiable de anclar ese patrón al campo específico en cuestión,exceptoeliminando prácticamente todo lo demás que sea de alguna utilidad y que podría estar intentando encontrar con este método en primer lugar.
Por ejemplo:
- Con su
u
opción para Linuxps
(que está-u
en BSDps
), hay unuser
campo que contiene nombres de usuario, cuyosgrep
patrones de búsqueda de nombres de programas también coincidirán en ocasiones. - El problema canónico (ejemplificado en "¿Cuál es la diferencia entre ps -ef | grep WDA y ps -ef | grep[W]DA?", "Coincidencia de nombres de programas, ¿por qué tantas coincidencias?", "Función del segundo grep en `ps | grep-v | grep`", ymuchosotros lugares en otros lugares) es, por supuesto, que el patrón pasado
grep
coincide con elgrep
del procesoargs
. - También puede coincidir con cadenas de entorno, lo cual es particularmente conmovedor dado lo que a menudo se puede encontrar en una
_
variable de entorno.
%ps -a -x -e -o sid,comm,args | grep dbus-daemon | cabeza -n 4 25 nosh cyclog dbus-daemon/ (nosh) 25 dbus-daemon dbus-daemon --config-file ./system-wide.conf --nofork --address=unix:path=/run/dbus/system_bus_socket 989 dbus-daemon dbus-daemon --config-file ./per-user.conf --nofork --address=unix:path=/run/user/JdeBP/bus 15107 grep grep dbus-daemon % %clearenv --keep-path \ setenv WIBBLE tmux \ ps -a -x -e -o sid,comm,comando | greptmux 15107 ps PATH=/usr/local/bin:/usr/bin:/bin WIBBLE=tmux ps -a -x -e -o sid,pid,comm,comando %
Dicho de otra manera: grep
es para operar con archivos de texto que comprenden líneas. La tabla de proceso no es un archivo de texto y al tratarla como si fuera un archivo de texto (traduciéndola con el ps
comando) se pierde información sobre los campos.
La forma de realizar dicha búsqueda es mirar la tabla de procesos con algo distinto a ps
. En Linux, se pueden mirar directamente /proc/${PID}/comm
los psuedo-archivos similares para las cadenas de argumentos, cadenas de entorno, etc.
O se puede escribir una herramienta que pesquelos datos específicos que deben coincidirde la tabla de proceso, y que ejecuta el mecanizado de patrones solo en ese campo. Esta herramienta no es para archivos de texto, sino para tablas de procesos. Uno puede llamarlo pgrep
.
Por supuesto, en la mano que agarra se podría escribir un ps
cuya salida sepoderprocesar con (digamos) awk
, porqueeslegible por máquina, codifica espacios en blanco vis()
y proporciona así campos que awk
se pueden reconocer correctamente. Lo malo es que luego es menoshumano-legible y no exactamente lo que ps
se supone que es un conforme. Paso su salida console-flat-table-viewer
para leerla. ☺
%control del sistema ps -p 740 -o sid,comm,args COMANDO SID COMANDO 25 dbus-daemon dbus-daemon\040--config-file\040./system-wide.conf\040--nofork\040'--address=unix:path=/run/dbus/system_bus_socket' % %control del sistema ps -A -o sid,comm,args,envs,tree | awk '{ if ("dbus-daemon"==$2) imprime $3; }' dbus-daemon\040--config-file\040./system-wide.conf\040--nofork\040'--address=unix:path=/run/dbus/system_bus_socket' dbus-daemon\040--config-file\040./per-user.conf\040--nofork\040'--address=unix:path=/run/user/JdeBP/bus' /usr/local/bin/dbus-daemon\040--fork\040--print-pid\0405\040--print-address\0407\040--session % %control del sistema ps -A -o sid,comm,args,envs,tree | awk '{ if ("dbus-daemon"==$2) imprime $3; }' | unvis dbus-daemon --config-file ./system-wide.conf --nofork '--address=unix:path=/run/dbus/system_bus_socket' dbus-daemon --config-file ./per-user.conf --nofork '--address=unix:path=/run/user/JdeBP/bus' /usr/local/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session %
Otras lecturas
ps
.Manual de comandos generales de NetBSD. 2016-12-02.vis
.Manual de funciones de la biblioteca NetBSD. 2017-04-22.- Shlomi Noaj (1 de octubre de 2009). Cómo NO probar que mysqld está vivo. código.openark.org.
- Greg Woolge. "El riesgo de analizar el árbol de procesos".Gestión de proceso. Wiki de Greg.
- Jonathan de Boyne Pollard (2015).
clearenv
.Guía de comida. Softwares. - Jonathan de Boyne Pollard (2015).
setenv
.Guía de comida. Softwares. - Jonathan de Boyne Pollard (2020).
ps
.Guía de comida. Softwares. - Jonathan de Boyne Pollard (2020).
list-process-table
.Guía de comida. Softwares.