back to top

Eseguire processi in background – Guida Linux

Nella lezione precedente della nostra guida Linux abbiamo vista cosa sono i processi ed in che modo vengono generati. Abbiamo visto che i processi di sistema (detti demoni) agiscono in background, cioè senza una interazione diretta con l’utente. Si tratta di processi che godono di una certa autonomia in quanto, appunto, l’interazione con l’utente non è indispensabile affinchè il processo possa svolgere la propria funzione.

Anche i processi lanciati dagli utenti, tuttavia, possono essere eseguiti in background (diventando del tutto simili ai demoni di sistema). In questa lezione vediamo come lanciare un processo in background.

Eseguire un comando in background

Nei sistemi Linux è possibile mandare in esecuzione in comando "dietro le quinte". Questo vuol dire, in poche parole, che il sistema operativo svolge un processo lasciando libero l’utente di fare altre cose.

Com’è evidente una simile caratteristica risulta molto comoda quando si ha a che fare con comandi che possono richiedere diverso tempo per svolgere il loro compito.

per fare un esempio si supponga di voler lanciare un log analyzer (come, ad esempio, Analog) per processare un file di log di diverse centinaia di megabyte. Una simile operazione potrebbe richiedere anche diverse ore e sarebbe davvero scomodo dover attendere questo tempo prima che il terminale si liberi per svolgere altre operazioni.

In circostanze come queste, appunto, è possibile lanciare il comando in background. Per farlo è sufficiente aggiungere una "e commerciale" – & – al termine dell’istruzione:

analog /var/log/httpd/access_log &

Se provate a lanciare un comando in questo modo vi accorgerete che immediatamente dopo la pressione del tasto invio la linea di comando sarà nuovamente disponibile per nuovi comandi.

Prima di "liberarsi", tuttavia, la shell risponderà al vostro comando in un modo del genere:

[4] 31177

Cosa significa questa stringa?

I due numeri visualizzati in risposta alla nostra istruzione identificano il processo all’interno del sistema operativo. Più precisamente:

  • Il primo risultato – [4] – identifica questo processo all’interno della nostra sessione di lavoro;
  • Il secondo numero – 31177 – è l’ID del processo, ossia l’identificativo univoco del nostro processo all’interno del sistema operativo.

Si noti che è anche possibile inviare una sequenza di comandi in background. Per farlo sarà sufficiente racchiudere i comandi tra parentesi tonde e separarli con un punto e virgola:

(analog /var/log/httpd/access_log_marzo;analog /var/log/httpd/access_log_aprile) &

Interrompere un processo e mandarlo in background

Poniamo di aver eseguito un comando e di esserci accorti, solo in un secondo momento, che la sua complessità richiederà diverso tempo per l’esecuzione. In questi casi la cosa migliore è stoppare il comando ed impostarlo in background.

Supponiamo di aver eseguito il comando analog normalmente:

analog /var/log/httpd/access_log

Per mandarlo in background sarà per prima cosa necessario procedere ad uno stop attraverso la pressione di CTRL+z. La risposta del server sarà qualcosa del genere:

[4]+ Stopped         analog /var/log/httpd/access_log

Il comando analog in questo momento è sospeso e corrisponde ad un processo che ha come numero 4. Ricordate che questo non è l’ID del processo nel sistema ma identifica semplicemente il numero di processo nella vostra sessione di lavoro.

Per riprendere l’esecuzione del processo in background dovete utilizzare il comando bg seguito dal numero del processo:

bg 4

Linux vi risponderà in questo modo:

[4]+ analog /var/log/httpd/access_log &

Come avrete notato ora la linea del comando termina con il carattere & che sta ad indicare, appunto, che il processo è stato messo in background.

Mandare un processo in "primo piano"

Vediamo ora come soddisfare l’esigenza contraria a quella appena descritta: vediamo, ciioè, come mandare in foreground un processo che sta girando in background.

Per fare ciò si ricorre al comando fg seguito dal numero del processo (non l’ID). Tornando all’esempio precedente dovremmo fare:

fg 4

NOTA: se non ricordate il numero del vostro processo potete sempre ricorrere al comando job che serve per stampare l’elenco di tutti i processi sospesi o in background con i relativi numeri.

Pubblicità
Massimiliano Bossi
Massimiliano Bossi
Stregato dalla rete sin dai tempi delle BBS e dei modem a 2.400 baud, ho avuto la fortuna di poter trasformare la mia passione in un lavoro (nonostante una Laurea in Giurisprudenza). Adoro scrivere codice e mi occupo quotidianamente di comunicazione, design e nuovi media digitali. Orgogliosamente "nerd" sono il fondatore di MRW.it (per il quale ho scritto centinaia di articoli) e di una nota Web-Agency (dove seguo in prima persona progetti digitali per numerosi clienti sia in Italia che all'estero).