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:
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 (
root
sia nel caso di processi di sistema o sia dell’utenteroot
) - Percentuale di CPU utilizzata
- Percentuale di memoria RAM utilizzata
- Tempo di esecuzione
- Nome del processo