Otras lecturas

Otras lecturas

¿Por qué es pgrepnecesario? Si podemos usar psy grepjuntos, ¿por qué lo necesitamos pgrep? Sería extraño si tuviéramos un comando lsgrepo 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 pspara que nos grepguste pgreppara poder ver el proceso del servidor tmux? ¿Cuáles son las diferencias entre pscon grepy pgrep?

Respuesta1

El pscomando tiene dos campos que, generalmente, se busca de esta forma, el argsy 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 tmuxrealmente hacen eso.

La salida de psesno 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. argsy commde hecho son dos de esos campos. La salida de pses sólo legible por humanos.

Por lo tanto , cuando grepel resultado pses 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:

%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: grepes 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 pscomando) 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}/commlos 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 pscuya salida sepoderprocesar con (digamos) awk, porqueeslegible por máquina, codifica espacios en blanco vis()y proporciona así campos que awkse pueden reconocer correctamente. Lo malo es que luego es menoshumano-legible y no exactamente lo que psse supone que es un conforme. Paso su salida console-flat-table-viewerpara 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

información relacionada