Se siete amministratori di sistema di alcuni server o anche solo semplicemente della vostra macchina potrebbe tornarvi utile saper come gestire i processi attivi su linux da terminale. Vedremo quindi come visualizzarli, gestirne le priorità, e terminarli in maniera più o meno forzata.
Nel nostro caso utilizzeremo una macchina ubuntu linux ma i comandi utilizzati sono per lo più standard e vi permetteranno di gestire i processi attivi sulla maggior parte delle distribuzioni linux.
Controllare i processi attivi su ubuntu
Per prima cosa prima di iniziare dobbiamo ottenere una finestra del terminale relativo alla macchina di cui vogliamo analizzare i processi. Se vogliamo agire sulla macchina locale basterà aprire semplicemente un terminale, se invece docciamo agire su un server remoto dovremo prima aprire un terminale e poi attraverso questo connetterci tramite ssh al server remoto.
Il comando ps
Il comando ps è uno dei primi comandi che bisogna imparare a usare quando si inizia a gestire i processi attivi in linux. Ci sono diverse “versioni” di questo comando in base alle opzioni usate e solitamente ognuno ha la sua preferita, quella che per lui visualizza le informazioni nel modo più comodo. Ne elencheremo qualcuna, la cosa migliore è provarle e scegliere quella che vi piace di più.
ps afx ps -aux ps -elf sudo ps -a sudo ps -U <nomeUtente> ps -U tom
Nella schermata qui sopra vediamo l’output del comando ps aux.
Il primo valore scritto è l’utente a cui appartiene il processo, cioè l’utente che ha lanciato il comando. Il processo avrà quindi i permessi di questo utente e potrà ad esempio accedere ai file con gli stessi permessi con qui può accedere l’utente a cui appartiene.
Il secondo valore è il PID. Il process id (Abbreviato PID) è il numero assegnato dal sistema alla singola istanza del singolo processo (ogni volta che il processo viene terminato e rilanciato il PID cambia). Questo numero permette quindi di identificare il processo in maniera univoca all’interno del sistema e sarà poi utile ad esempio per usare il comando kill per terminare un singolo processo.
Il terzultimo valore è l’ora in cui è stato lanciato il comando.
L’ultimo è il comando che ha lanciato il processo. Questo valore è quello che ci indica fondamentalmente di cosa si tratta e ci permette di distinguere il processo che stiamo cercando in mezzo a tutti gli altri. Questo valore è comodo anche per verificare nel caso in cui stiamo utilizzando script o cose simili quale è stata la stringa che ha lanciato il processo e con quali opzioni.
L’output del comando ps può essere abbastanza lungo, vengono infatti inclusi tutti i processi di sistema che girano in backgroud e di cui spesso non ci rendiamo neanche conto. In questi casi possiamo passare l’output di ps a more o a less per poterlo navigare molto più agevolmente.
ps -aux | more ps -aux | less
Per uscire da more o da less basta premere il tasto q.
Spesso quando si esegue ps si è in cerca di uno specifico processo o una specifica serie di processi, risulta comodo quindi filtrare i risultati con il comando grep o con il comando egrep.
ps aux | grep tomcat sudo ps aux | grep vim sudo ps aux | grep gnome sudo ps -aux | egrep 'sshd|openvpn'
Il comando pgrep
Molte varianti di Ubuntu Linux comprendono il comando pgrep che serve proprio a cercare i processi. Vediamo alcuni esempi:
pgrep process sudo pgrep sshd pgrep vim pgrep chromium-browser pgrep -l nginx
L’aggiunta dell’opzione -l lista nel formato lungo, includendo anche il nome del processo, in questo caso utile per capire ogni PID a che processo appartiene.
Il comando top e il comando htop
Il comando top è uno dei comando più importanti da conoscere, permette infatti di avere una lista dei processi attivi che consumano più CPU, memoria RAM o disco oltre a un piccolo riassunto dello stato generale della macchina. Se volete conoscere altri dettagli sullo stato generale della macchina potete leggere l’articolo sui comandi per ottenere informazioni sull’hardware.
Questi sono alcuni esempi della sintassi del comando top
top sudo top sudo top [opzioni]
Un altro comando simile a top ma graficamente un po’ più avanzato è il comando htop, che non è installato di base in tutte le distribuzioni ma può valere la pena di installarlo manualmente per la sua comodità. Su ubuntu basterà il comando:
sudo apt-get install htop
Una volta installato possiamo lanciarlo con il comando
htop
Per uscire da top e da htop basta premere il tasto q.
Il comando kill
Il comando kill è la via più semplice per terminare dall’esterno un processo, senza cioè terminare il processo attraverso le opzioni fornite dallo stesso (come ad esempio chiudere la finestra facendo click sulla x o terminare less/htop premendo q). Kill è spesso usato per terminare applicazioni che si sono bloccate e non rispondono più agli input dell’utente.
La sintassi base è
kill <pid>
Si può quindi trovare il PID di un processo attraverso uno dei metodi visti prima (ps, pgrep, top, htop) e poi una volta ottenuto il PID passarlo come argomento a kill per terminare l’applicazione. Se volessimo quindi terminare il processo con PID 10245 basterà eseguire nel terminale:
kill 10245
Ricordiamo sempre che i PID sono strettamente relativi a ogni singola istanza del processo quindi accertiamoci sempre di cercare e killare i processi sulla stessa macchina, i PID sono numeri di poche cifre quindi il rischio è quello di terminare il processo sbagliato o un processo a caso su una macchina diversa da quella che volevamo.
Se dopo il comando kill semplice il processo non dovesse arrestarsi possiamo provare con la “forza bruta” e killare il processo forzatamente con il segnale -9
kill -9 10245
Il comando pkill
Se vogliamo terminare un processo attraverso il suo nome invece che in base al PID possiamo usare il comando pkill. Questo comando richiede particolare attenzione in quanto, a differenza del comando kill in cui il PID è univoco per la singola istanza del processo, il nome del processo potrebbe non essere univoco e rischiamo di terminare processi che non vogliamo.
pkill htop pkill -9 htop
Il comando nice e il comando renice
Il comando nice serve a lanciare un comando/processo con un livello di priorità diverso da quello standard. Il comando renice invece serve a modificare la priorità di un comando/processo in esecuzione.
Il valore di priorità può variare fra -20 e 19, dove 19 è la priorità più bassa.
Se ad esempio vogliamo lanciare una compilazione di un programma c su una macchina già carica di lavoro senza rischiare di sovraccaricarla possiamo eseguire il compilatore con una priorità più bassa:
nice -n 13 cc -c *.c &
Mentre per cambiare la priorità di un processo in esecuzione la sintassi è la seguente:
renice <Priorità> -p <PID> renice <Priorità> <PID>
Abbiamo visto in questa pagina come gestire i processi attivi in linux da terminale. Per visualizzare altre informazioni sullo stato dei processi e della macchina in generale vi consigliamo di leggere l’articolo sui comandi linux per ottenere hardware info.