Hace mucho tiempo en la historia de UNIX, los usuarios de un servidor eran usuarios reales de UNIX con entradas en /etc/shadow
y un shell de inicio de sesión interactivo y un directorio de inicio. Había herramientas para que los administradores se comunicaran con los usuarios y monitorearan su actividad para evitar errores estúpidos o maliciosos que causarían una asignación injusta de los recursos del servidor.
En estos días, es menos probable que su base de usuarios tenga entradas en /etc/shadow
, en lugar de ser administrado por una capa de abstracción, ya sea LDAP, Drupal u OpenShift. Por otra parte, ahora hay muchos más servidores, lo que significa que hay muchos más administradores de sistemas que inician y cierran sesión para realizar el mantenimiento. Donde hay actividad, hay oportunidad para errores y confusión, así que es hora de desempolvar esas viejas herramientas de monitoreo y darles un buen uso.
Estos son algunos de los comandos de monitoreo que puede haber olvidado (o que nunca conoció) para ayudarlo a rastrear lo que ha estado sucediendo en su servidor.
quien
Primero, lo básico.
El who
El comando es proporcionado por el paquete GNU coreutils, y su trabajo principal es analizar el /var/log/utmp
archivar e informar sus hallazgos.
El utmp
El archivo registra los usuarios actuales en el sistema. No necesariamente muestra todos los procesos, porque no todos los programas inician utmp
Inicio sesión. De hecho, es posible que su sistema ni siquiera tenga un utmp
archivo por defecto. En ese caso, who
recurre a /var/log/wtmp
, que registra todos los inicios y cierres de sesión.
El wtmp
el formato de archivo es exactamente el mismo que utmp
, excepto que un nombre de usuario nulo indica un cierre de sesión y el ~
El carácter indica un apagado o reinicio del sistema. El wtmp
el archivo es mantenido por login(1)
, init(1)
y algunas versiones de getty(8)
, sin embargo, ninguna de estas aplicaciones crea el archivo, por lo que si elimina wtmp
, entonces se desactiva el mantenimiento de registros. Solo eso es bueno saberlo:si wtmp
falta, ¡deberías averiguar por qué!
La salida de who --heading
se parece a esto:
NAME LINE TIME COMMENT
seth tty2 2020-01-26 18:19 (tty2)
larry pts/2 2020-01-28 13:02 (10.1.1.8)
curly pts/3 2020-01-28 14:42 (10.1.1.5)
Esto le muestra el nombre de usuario de cada persona que inició sesión, la hora en que se registró su inicio de sesión y su dirección IP.
El who
El comando también proporciona humildemente la forma POSIX oficial de descubrir qué usuario usted están registrados como, pero solo si utmp
existe:
$ who -m
curly pts/3 2020-01-28 14:44 (10.1.1.8)
También proporciona un mecanismo para mostrar el nivel de ejecución actual:
$ who -r
run-level 5 2020-01-26 23:58
w
Para un poco más de contexto sobre los usuarios, el simple w
El comando proporciona una lista de quién ha iniciado sesión y qué está haciendo. Esta información se muestra en un formato similar a la salida de who
, pero el tiempo que el usuario ha estado inactivo, el tiempo de CPU utilizado por todos los procesos adjuntos al TTY de inicio de sesión y el tiempo de CPU utilizado solo por el proceso actual. El proceso actual del usuario aparece en el campo final.
Salida de muestra:
$ w
13:45:48 up 29 days, 19:24, 2 users, load average: 0.53, 0.52, 0.54
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
seth tty2 Sun18 43:22m 0.01s 0.01s /usr/libexec/gnome-session-binary
curly pts/2 13:02 35:12 0.03s 0.03s -bash
Alternativamente, puede ver la dirección IP del usuario con -i
o --ip-addr
opción.
Puede restringir la salida a un solo nombre de usuario especificando sobre qué usuario desea información:
$ w seth
13:45:48 up 29 days, 19:27, 2 users, load average: 0.53, 0.52, 0.54
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
seth tty2 Sun18 43:25m 0.01s 0.01s /usr/libexec/gnome-session-binary
utmpdump
El utmpdump
La utilidad hace (casi) exactamente lo que sugiere su nombre:vuelca el contenido del /var/log/utmp
archivo a su pantalla. En realidad, arroja cualquiera el utmp
o el wtmp
archivo, dependiendo de lo que especifique. Por supuesto, el archivo que especifique no tiene que estar ubicado en /var/log
o incluso llamado utmp
o wtmp
, y ni siquiera tiene que estar en el formato correcto. Si alimentas utmpdump
un archivo de texto, vuelca el contenido a su pantalla (o un archivo, con el --output
opcional) en un formato predecible y fácil de analizar.
Normalmente, por supuesto, solo usaría who
o w
para analizar los registros de inicio de sesión, pero utmpdump
es útil en muchos casos.
- Los archivos pueden corromperse. Mientras que
who
yw
a menudo son capaces de detectar la corrupción por sí mismos,utmpdump
es cada vez más tolerante porque no analiza por sí solo. Muestra los datos sin procesar para que usted los trate. - Una vez que haya reparado un archivo dañado,
utmpdump
puede parchear sus cambios nuevamente. - A veces, solo desea analizar los datos usted mismo. Tal vez estés buscando algo que
who
yw
no están programados para buscar, o tal vez está tratando de hacer sus propias correlaciones.
Sea cual sea el motivo, utmpdump
es una herramienta útil para extraer datos sin procesar de los registros de inicio de sesión.
Si reparó un registro de inicio de sesión dañado, puede usar utmpdump
para volver a escribir los cambios en el registro maestro:
$ sudo utmpdump -r < wtmp.fix > /var/log/wtmp
ps
Una vez que sepa quién ha iniciado sesión en su sistema, puede usar ps
para obtener una instantánea de los procesos actuales. Esto no debe confundirse con la parte superior, que muestra un informe en ejecución sobre los procesos actuales; esta es una instantánea tomada en el momento ps
se emite y luego se imprime en su pantalla. Ambos tienen ventajas y desventajas, por lo que puede elegir cuál usar según sus requisitos. Debido a su naturaleza estática, ps
es particularmente útil para análisis posteriores, o simplemente como un buen resumen manejable.
El ps
El comando es antiguo y conocido, y parece que muchos administradores han aprendido el antiguo comando de UNIX en lugar de la última implementación. El moderno ps
(del procps-ng
package) ofrece muchos mnemotécnicos útiles, y es lo que se incluye en RHEL, CentOS, Fedora y muchas otras distribuciones, por lo que es lo que usa este artículo.
Puede hacer que todos los procesos sean ejecutados por un solo usuario con --user
(o -u
), junto con el nombre de usuario de quien desea un informe. Para dar a la salida el contexto agregado de qué proceso es el padre de un proceso hijo, use el --forest
opción para una vista de "árbol":
$ ps --forst --user larry
PID TTY TIME CMD
39707 ? 00:00:00 sshd
39713 pts/4 00:00:00 \_ bash
39684 ? 00:00:00 systemd
39691 ? 00:00:00 \_ (sd-pam)
Para cada proceso en el sistema:
$ ps --forest -e
[...]
29284 ? 00:00:48 \_ gnome-terminal-
29423 pts/0 00:00:00 | \_ bash
42767 pts/0 00:00:00 | | \_ ps
39631 pts/1 00:00:00 | \_ bash
39671 pts/1 00:00:00 | \_ ssh
32604 ? 00:00:00 \_ bwrap
32612 ? 00:00:00 | \_ bwrap
32613 ? 00:09:05 | \_ dring
32609 ? 00:00:00 \_ bwrap
32610 ? 00:00:15 \_ xdg-dbus-proxy
1870 ? 00:00:05 gnome-keyring-d
4809 ? 00:00:00 \_ ssh-agent
[...]
Las columnas predeterminadas son útiles, pero puede cambiarlas para que se adapten mejor a lo que está investigando. El -o
La opción le da control total sobre las columnas que ve. Para obtener una lista completa de las posibles columnas, consulte los Especificadores de formato estándar. sección del ps(1) página man.
$ ps -eo pid,user,pcpu,args --sort user
42799 root 0.0 [kworker/u16:7-flush-253:1]
42829 root 0.0 [kworker/0:2-events]
42985 root 0.0 [kworker/3:0-events_freezable_power_]
1181 rtkit 0.0 /usr/libexec/rtkit-daemon
1849 seth 0.0 /usr/lib/systemd/systemd --user
1857 seth 0.0 (sd-pam)
1870 seth 0.0 /usr/bin/gnome-keyring-daemon --daemonize --login
1879 seth 0.0 /usr/libexec/gdm-wayland-session /usr/bin/gnome-session
El ps
El mando es muy flexible. Puede modificar su salida de forma nativa para no tener que depender de grep
y awk
para encontrar lo que te importa. Crea un buen ps
comando, póngale un alias a algo memorable y ejecútelo con frecuencia. Es una de las mejores formas de mantenerse informado sobre lo que sucede en su servidor.
pgrep
A veces, es posible que tenga alguna idea de un proceso problemático y necesite investigarlo en lugar de sus usuarios o sistema. Para hacer eso, existe el pgrep
comando desde el psproc-ng
paquete.
En su forma más básica, pgrep
funciona como un grep en la salida de ps
:
$ pgrep bash
29423
39631
39713
En lugar de enumerar los PID, puede obtener un recuento de cuántos PID se devolverían:
$ pgrep --count bash
3
Para más información, puede afectar su búsqueda a través de procesos por nombre de usuario (-u
), terminal (--terminal
), y edad (--newest
y --oldest
), y más. Para encontrar un proceso perteneciente a un usuario específico, por ejemplo:
$ pgrep bash -u moe --list-name
39631 bash
Incluso puede obtener coincidencias inversas con --inverse
opción.
matar
Relacionado con pgrep
es el pkill
dominio. Es muy parecido a kill
comando, excepto que usa las mismas opciones que pgrep
para que pueda enviar señales a un proceso problemático utilizando la información que le resulte más fácil.
Por ejemplo, si ha descubierto que un proceso iniciado por el usuario larry
está monopolizando los recursos, y lo sabes por w
ese larry
se encuentra en la terminal pts/2
, luego puede eliminar la sesión de inicio de sesión y todos sus elementos secundarios con solo el nombre del terminal:
$ sudo pkill -9 --terminal pts/2
O puede usar solo el nombre de usuario para finalizar todos los procesos que coincidan con él:
$ sudo pkill -u larry
Usado juiciosamente, pkill
es un buen botón de "pánico" o una solución estilo mazo cuando un problema se ha ido de las manos.
Supervisión de terminales
El hecho de que exista una serie de comandos en una terminal no significa que sean necesariamente mejores que otras soluciones. Haga un balance de sus requisitos y elija la mejor herramienta para lo que necesita. A veces, un sistema gráfico de monitoreo y generación de informes es exactamente lo que necesita, y otras veces, los comandos de terminal que se escriben y analizan fácilmente son la respuesta correcta. Elija sabiamente, aprenda sus herramientas y nunca estará a oscuras sobre lo que está sucediendo dentro de su bare metal.
[¿Quiere obtener más información sobre supervisión y seguridad? Consulte la lista de verificación de cumplimiento y seguridad de TI. ]