Molto tempo fa nella storia di UNIX, gli utenti su un server erano utenti UNIX effettivi con voci in /etc/shadow
e una shell di accesso interattiva e una home directory. C'erano strumenti per gli amministratori per comunicare con gli utenti e per monitorare la loro attività per evitare errori stupidi o dannosi che avrebbero causato l'allocazione ingiusta delle risorse del server.
Al giorno d'oggi, è meno probabile che la tua base di utenti abbia voci in /etc/shadow
, invece di essere gestito da un livello di astrazione, che si tratti di LDAP o Drupal o OpenShift. Inoltre, ora ci sono molti più server, il che significa che ci sono molti più amministratori di sistema che accedono e si disconnettono per eseguire la manutenzione. Dove c'è attività, c'è possibilità di errori e confusione, quindi è tempo di rispolverare quei vecchi strumenti di monitoraggio e metterli a frutto.
Ecco alcuni dei comandi di monitoraggio di cui potresti esserti dimenticato (o di cui non sapevi) per aiutarti a tenere traccia di ciò che sta accadendo sul tuo server.
chi
Innanzitutto, le basi.
Il who
il comando è fornito dal pacchetto GNU coreutils e il suo compito principale è analizzare il /var/log/utmp
archiviare e segnalare i suoi risultati.
Il utmp
file registra gli utenti correnti sul sistema. Non mostra necessariamente tutti i processi, perché non tutti i programmi avviano utmp
registrazione. In effetti, il tuo sistema potrebbe non avere nemmeno un utmp
file per impostazione predefinita. In tal caso, who
ricade su /var/log/wtmp
, che registra tutti gli accessi e i logout.
Il wtmp
il formato del file è esattamente lo stesso di utmp
, tranne per il fatto che un nome utente nullo indica una disconnessione e il ~
il carattere indica un arresto o un riavvio del sistema. Il wtmp
il file è gestito da login(1)
, init(1)
e alcune versioni di getty(8)
, tuttavia, nessuna di queste applicazioni crea il file, quindi se rimuovi wtmp
, la registrazione viene disattivata. Solo questo è buono a sapersi:se wtmp
manca, dovresti scoprire perché!
L'output di who --heading
assomiglia a questo:
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)
Questo ti mostra il nome utente di ogni persona che ha effettuato l'accesso, l'ora in cui è stato registrato il suo accesso e il suo indirizzo IP.
Il who
command fornisce anche umilmente il modo ufficiale POSIX per scoprire quale utente tu sono loggati come, ma solo se utmp
esiste:
$ who -m
curly pts/3 2020-01-28 14:44 (10.1.1.8)
Fornisce inoltre un meccanismo per visualizzare il runlevel corrente:
$ who -r
run-level 5 2020-01-26 23:58
w
Per un po' più di contesto sugli utenti, il semplice w
comando fornisce un elenco di chi ha effettuato l'accesso e cosa stanno facendo. Queste informazioni vengono visualizzate in un formato simile all'output di who
, ma il tempo in cui l'utente è rimasto inattivo, il tempo CPU utilizzato da tutti i processi collegati al TTY di accesso e il tempo CPU utilizzato solo dal processo corrente. Il processo corrente dell'utente è elencato nel campo finale.
Esempio di output:
$ 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
In alternativa, puoi visualizzare l'indirizzo IP dell'utente con -i
o --ip-addr
opzione.
Puoi restringere l'output a un singolo nome utente specificando su quale utente desideri informazioni su:
$ 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
Il utmpdump
utility fa (quasi) esattamente quello che suggerisce il nome:scarica il contenuto del /var/log/utmp
file sul tuo schermo. In realtà, scarica o il utmp
o il wtmp
file, a seconda di quello specificato. Ovviamente, il file che specifichi non deve trovarsi in /var/log
o anche chiamato utmp
o wtmp
, e non deve nemmeno essere nel formato giusto. Se inserisci utmpdump
un file di testo, scarica il contenuto sullo schermo (o un file, con il --output
opzione) in un formato prevedibile e facile da analizzare.
Normalmente, ovviamente, useresti semplicemente who
o w
per analizzare i record di accesso, ma utmpdump
è utile in molti casi.
- I file possono essere danneggiati. Mentre
who
ew
sono spesso in grado di rilevare la corruzione da soli,utmpdump
è sempre più tollerante perché non esegue analisi da solo. Rende i dati grezzi da gestire. - Dopo aver riparato un file danneggiato,
utmpdump
può ripristinare le modifiche apportate. - A volte vuoi solo analizzare i dati da solo. Forse stai cercando qualcosa che
who
ew
non sono programmati per cercare, o forse stai cercando di creare correlazioni tutte tue.
Qualunque sia il motivo, utmpdump
è uno strumento utile per estrarre dati grezzi dai record di accesso.
Se hai riparato un log di accesso danneggiato, puoi usare utmpdump
per riscrivere le modifiche nel registro principale:
$ sudo utmpdump -r < wtmp.fix > /var/log/wtmp
ps
Una volta che sai chi ha effettuato l'accesso al tuo sistema, puoi utilizzare ps
per ottenere un'istantanea dei processi in corso. Questo non deve essere confuso con la parte superiore, che mostra un rapporto in esecuzione sui processi correnti; questa è un'istantanea scattata nel momento ps
viene emesso e quindi stampato sullo schermo. Ci sono vantaggi e svantaggi per entrambi, quindi puoi scegliere quale utilizzare in base alle tue esigenze. A causa della sua natura statica, ps
è particolarmente utile per analisi successive, o semplicemente come un bel riassunto gestibile.
Il ps
il comando è vecchio e noto e sembra che molti amministratori abbiano imparato il vecchio comando UNIX piuttosto che l'ultima implementazione. Il moderno ps
(dal procps-ng
pacchetto) offre molti utili mnemonici ed è ciò che viene fornito su RHEL, CentOS, Fedora e molte altre distribuzioni, quindi è ciò che utilizza questo articolo.
Puoi far eseguire tutti i processi da un singolo utente con il --user
(o -u
), insieme al nome utente di chi vuoi creare un rapporto. Per fornire all'output il contesto aggiunto di quale processo è padre di un processo figlio, usa il --forest
opzione per una vista ad "albero":
$ 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)
Per ogni processo sul 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
[...]
Le colonne predefinite sono utili, ma puoi modificarle per adattarle meglio a ciò che stai cercando. Il -o
opzione ti dà il pieno controllo su quali colonne vedi. Per un elenco completo delle possibili colonne, fare riferimento agli Specificatori di formato standard sezione di ps(1) pagina 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
Il ps
il comando è molto flessibile. Puoi modificarne l'output in modo nativo in modo da non dover fare affidamento su grep
e awk
per trovare ciò che ti interessa. Crea un buon ps
comando, alias a qualcosa di memorabile ed eseguilo spesso. È uno dei modi migliori per rimanere informato su ciò che sta accadendo sul tuo server.
pgrep
A volte, potresti avere un'idea di un processo problematico e dover indagare su di esso anziché sui tuoi utenti o sul tuo sistema. Per farlo, c'è il pgrep
comando da psproc-ng
pacchetto.
Nella sua forma più elementare, pgrep
funziona come un grep sull'output di ps
:
$ pgrep bash
29423
39631
39713
Invece di elencare i PID, puoi semplicemente ottenere un conteggio di quanti PID verrebbero restituiti:
$ pgrep --count bash
3
Per ulteriori informazioni, puoi influenzare la tua ricerca attraverso processi per nome utente (-u
), terminale (--terminal
) ed età (--newest
e --oldest
), e altro ancora. Per trovare un processo appartenente a un utente specifico, ad esempio:
$ pgrep bash -u moe --list-name
39631 bash
Puoi persino ottenere corrispondenze inverse con --inverse
opzione.
pkill
Relativo a pgrep
è il pkill
comando. È molto simile a kill
comando, tranne per il fatto che utilizza le stesse opzioni di pgrep
così puoi inviare segnali a un processo problematico utilizzando tutte le informazioni per te più facili.
Ad esempio, se hai scoperto che un processo avviato dall'utente larry
sta monopolizzando le risorse e lo sai da w
quel larry
si trova sul terminale pts/2
, quindi puoi terminare la sessione di accesso e tutti i suoi figli solo con il nome del terminale:
$ sudo pkill -9 --terminal pts/2
Oppure puoi utilizzare solo il nome utente per terminare tutti i processi corrispondenti:
$ sudo pkill -u larry
Usato con giudizio, pkill
è una buona soluzione con un pulsante "panico" o una mazza quando un problema è sfuggito di mano.
Monitoraggio terminale
Solo perché in un terminale esiste una serie di comandi non significa che siano necessariamente migliori di altre soluzioni. Fai il punto sulle tue esigenze e scegli lo strumento migliore per quello che ti serve. A volte un sistema grafico di monitoraggio e reporting è esattamente ciò di cui hai bisogno, e altre volte i comandi del terminale facilmente script e analizzati sono la risposta giusta. Scegli saggiamente, impara i tuoi strumenti e non sarai mai all'oscuro di ciò che sta accadendo nel tuo bare metal.
[Vuoi saperne di più su monitoraggio e sicurezza? Consulta la checklist di sicurezza e conformità IT. ]