Gestione e monitoraggio dei processi in UNIX spiegati in poche parole

Gestione e monitoraggio dei processi in UNIX spiegati in poche parole

Durante la quotidiana gestione di un sistema UNIX, sarà sicuramente necessario, almeno una volta, visualizzare o anche gestire i processi attivi sul proprio sistema, in seguito ad una necessità o ad una semplice attività di monitoraggio.

Visualizzare tutti i processi attivi da parte di tutti gli utenti

ps aux

Il comando ps permette di stampare a schermo tutti i processi aventi come “genitore” l’utente che invoca il comando.

Esempio, ps senza alcun parametro, restituirà in una situazione end-user classica, il semplice output:

$ ps
  PID TTY          TIME CMD
10270 pts/2    00:00:07 bash
10783 pts/2    00:00:00 ps

Dove la prima riga sarebbe la shell BASH, in cui l’utente è attualmente loggato, e poi il comando ps che l’utente ha invocato.

Per “allargare” la ricerca a tutti i processi, compresi quelli senza un utente che li ha invocati, si aggiungono i parametri aux.

$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1 166356  8344 ?        Ss   May30   1:32 /lib/systemd/systemd --system
root         2  0.0  0.0      0     0 ?        S    May30   0:01 [kthreadd]
root         3  0.0  0.0      0     0 ?        I<   May30   0:00 [rcu_gp]
root         4  0.0  0.0      0     0 ?        I<   May30   0:00 [rcu_par_gp]
root         6  0.0  0.0      0     0 ?        I<   May30   0:00 [kworker/0:0H-kblockd]
root         8  0.0  0.0      0     0 ?        I<   May30   0:00 [mm_percpu_wq]
root         9  0.0  0.0      0     0 ?        S    May30   0:08 [ksoftirqd/0]
root        10  0.0  0.0      0     0 ?        I    May30  16:18 [rcu_sched]
root        11  0.0  0.0      0     0 ?        S    May30   0:05 [migration/0]
xrdp       748  0.0  0.0  12948  1844 ?        S    May30   1:17 /usr/sbin/xrdp
user     10270  0.1  0.0  10960  5240 pts/2    Ss   13:50   0:07 -bash
root     11050  0.0  0.0      0     0 ?        I    14:39   0:00 [kworker/2:0-events]
root     11600  0.0  0.0      0     0 ?        I    15:14   0:00 [kworker/0:2]
[...]

$

In ordine da sinistra, le informazioni che ps aux stampa su schermo sono:

  • Utente che ha invocato il comando
  • Process ID;
  • Percentuale di utilizzo CPU;
  • Percentuale di spazio riservato in RAM;
  • VSZ (“Virtual Set Size”) indica la quantità di memoria che il sistema riserva per il processo;
  • RSS (“Resident Set Size”) indica, a differenza della VSZ, la quantità di memoria attualmente in uso da un processo;
  • Il videoterminale (TTY) da cui è stato eseguito il processo. Se il processo non è stato eseguito da un videoterminale, come ad esempio i processi di sistema, viene mostrato un punto interrogativo;
  • Il codice di stato attuale del processo (vedere man ps per i significat dei singoli codici di stato)
  • Ora/giorno di inizio del processo
  • Tempo cumulato della CPU dedicata all’esecuzione del processo
  • Riga di comando che ha invocato il processo

Cercare un processo desiderato tra i processi in esecuzione

Utilizzando una pipe del processo ps aux, è possibile cercare tra l’elenco dei processi un’esecuzione che ci interessa con il comando grep.

La sintassi è ps aux | grep [nome processo desiderato].

Un esempio:

$ ps aux | grep qbittorrent
 root      6653  0.6  2.3 1030600 190544 ?      Sl   Jun03 191:35 qbittorrent-nox
 root      7792  0.0  0.0   8856   980 pts/0    S+   14:06   0:00 grep --color=auto qbittorrent
$

In tutte le ricerche che si effettueranno in questo modo, verrà visualizzato tra i processi attivi lo stesso comando grep che avremo eseguito, perciò non andrà considerato come risultato desiderato.

Per ovviare a questo risultato, si può implementare un secondo grep:

$ ps aux | grep qbittorrent | grep -v grep
root      6653  0.6  2.3 1030600 191864 ?      Sl   Jun03 191:36 qbittorrent-nox
$

Per ridurre la quantità di informazioni stampati sul terminale, pur tenendo le informazioni necessari, si può usare il solo parametro x sul comando ps:

$ ps x | grep qbittorrent | grep -v grep
  6653 ?        Sl   191:43 qbittorrent-nox
$

Fermare un processo

Per fermare un processo in esecuzione nel proprio terminale, si può inviare un segnale di stop al terminale con la combinazione CTRL + C.

Nel caso in cui il processo si sia “congelato” nel suo stato, non rispondendo a qualsiasi comando dell’utente, si può tentare di mandare il processo in background con la combinazione CTRL + Z, per poi ricercarlo con il metodo descritto precedentemente e infine terminarlo con il comando kill [process ID].

C’è da fare attenzione, però, perché il solo comando kill invia al processo indicato un segnale di stop (chiamato tecnicamente SIGTERM), che il processo può interpretare ed eseguire nella maniera in cui è stato programmato (potrebbe presentarsi anche la situazione in cui il processo in questione non abbia implementata una funzione di chiusura appropriata, complicandone la rimozione dalla memoria).

Se, come nel caso precedente, il processo sia irrevocabilmente congelato e non accettasse alcun tipo di input o segnale, si dovranno ricorrere alle maniere forti con il famigerato e noto kill -9 [process ID] (chiamato tecnicamente SIGKILL).

La differenza, quindi, tra il semplice kill e il kill -9 sta nello specificare il segnale appropriato da inviare all’applicazione.

Il semplice kill invia un SIGTERM, ossia un “spegniti nella maniera più appropriata”.
La ragione dell’usare un SIGTERM sta nel fatto che, se un processo sta elaborando dati sensibili (es. MySQL o un servizio web in fase di COMMIT), con il SIGTERM finisce di elaborare i dati, salvando il necessario o rilasciando eventuali dipendenze che aveva riservato per sé.

Con il kill -9 si invia, invece, un segnale SIGKILL, che ho già detto significare “termina qui la tua esecuzione, non importa come e cosa stai “. Ovviamente questa procedura è come staccare la spina ad un PC fisso: può essere innocua quando non si hanno documenti aperti o non si stanno eseguendo operazioni di scrittura/lettura su un dispositivo, ma in caso ciò si stesse verificando si rischierebbe una corruzione di dati, un danneggiamento fisico del dispositivo (in caso di Hard Drive meccanici e uno sbalzo di tensione durante lo spegnimento), perciò questa pratica di “spegnimento forzato” non è mai consigliata salvo eccezioni rare e ben specifiche, come l’appunto il “totale congelamento del processo/macchina impossibile da sbrogliare”.

Per ulteriori informazioni sui segnali SIG*, si può visitare la pagina del manuale di signal con:

$ man signal

Oppure visitare il sito:

http://man7.org/linux/man-pages/man7/signal.7.html

Classifica dei processi più dispendiosi di risorse

Salvo specifico parametro (--sort), il comando ps aux non ordina i processi per memoria utilizzata, processore riservato o così via, ma solo cronologicamente, in base a quando essi sono stati invocati.

Per una vera e propria classifica di processi in esecuzione, si usa il comando top, appunto “top processes”.

A differenza di ps, il comando top cancellerà tutto lo schermo e stamperà in output una tabella in tempo reale (con ritardo di aggiornamento di 3 secondi, se non diversamente configurato) di tutti i processi in esecuzione, ordinati per CPU utilizzata.

$ top
top - 21:53:13 up 20 days, 12:20,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 161 total,   1 running, 160 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.1 us,  0.3 sy,  0.0 ni, 99.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   7974.1 total,   6404.3 free,    551.0 used,   1018.8 buff/cache
MiB Swap:   2048.0 total,   1918.7 free,    129.2 used.   7131.7 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
 6653 root      20   0 1030600 191668  12052 S   1.0   2.3 119:07.42 qbittorrent-nox
   10 root      20   0       0      0      0 I   0.3   0.0  16:30.98 rcu_sched
  709 root      20   0 1605016  14368   6692 S   0.3   0.2  53:39.74 containerd
 3495 user      20   0  160436  11148   1204 S   0.3   0.1  33:26.11 python
17587 user      20   0   11776   3744   3160 R   0.3   0.0   0:00.03 top
    1 root      20   0  166356   8344   5832 S   0.0   0.1   1:32.58 systemd
    2 root      20   0       0      0      0 S   0.0   0.0   0:01.40 kthreadd
[...]

Tra le altre informazioni presenti sulla schermata, si ha anche:

  • System time (21:53:13)
  • Uptime (attivo da 20 giorni, 12 ore e 20 minuti)
  • Utenti loggati (1)
  • Carico del sistema medio negli ultimi 5, 10 e 15 minuti (0.00, 0.00 e 0.00)
  • Panoramica dei processi attivi (161 processi totali, 1 processo in esecuzione, 160 processi in “sleep”, nessun processo fermato e nessun processo zombie)
  • Percentuali dei tempi di lavoro del processore (0.1% per processi invocati dall’utente, 0.3% per processi di sistema, ecc…)
  • Panoramica di memoria RAM e Swap totale, disponibile e utilizzata

Infine, sotto il testo in grassetto, le informazioni che probabilmente ci interessa sapere di più sono:

  • Process ID
  • Utente proprietario del processo (rootsia nel caso di processi di sistema o sia dell’utente root)
  • Percentuale di CPU utilizzata
  • Percentuale di memoria RAM utilizzata
  • Tempo di esecuzione
  • Nome del processo
Mostra i Commenti