Cookie

Mandare un processo in background e foreground con Linux

Pubblicato da TheJoe il

Tempo di lettura stimato: 2 minuti

Attenzione


Questo articolo è stato pubblicato più di un anno fa, potrebbero esserci stati sviluppi.
Ti preghiamo di tenerne conto.

Qualche articolo fa abbiamo parlato di screen: un applicativo a riga di comando che permette di creare sessioni virtuali contenenti finestre di terminale virtuali a cui possiamo collegarci o scollegarci a piacimento tramite la sessione terminale corrente.

Screen è un programma molto potente, intuitivo dopo qualche utilizzo, che può fare molte cose (e infatti le scorciatoie sono moltissime e troppe da elencare), ma oggi parliamo delle sessioni classiche.

Anche in questo caso un comando può durare svariati minuti, o anche delle ore. Si rende quindi necessario un sistema per liberare il terminale ed eseguire nuovi comandi, lasciando quelli vecchi in esecuzione in background.

Avviare un processo in background

Supponiamo di avere un processo che, una volta eseguito, occupa la sessione terminale e ci impedisce di eseguire altri comandi fino alla fine dell’esecuzione. Ad esempio, nel caso in cui il disco dati utilizzato sia grande e pieno di dati updatedb può metterci veramente molto a terminare l’indice dei file.

~# updatedb

Abbiamo due soluzioni.

Usare la “e – commerciale” (&)

Il primo metodo è semplicemente aggiungere una & alla fine del comando. Il processo andrà automaticamente in background, la shell verrà liberata e potrà essere usata immediatamente.

~# updatedb &
[1] 342824
~#

In questo scenario, oltre a rendere disponibile il terminale subito, il comando restituisce il numero identificativo del processo (PID) con il quale possiamo monitorare lo stato di esecuzione tramite il comando ps.

~# ps ax | grep updatedb
342824 pts/2 S 0:00 /bin/sh /usr/bin/updatedb
~#

Usare la scorciatoia Ctrl+Z e il comando bg

Questo metodo è anche più interessante del primo, perché anche se non prevediamo che il comando possa bloccare il terminale per molto tempo, potremo mettere il processo in pausa e mandarlo in background per proseguire l’esecuzione.

~# updatedb
^Z                       # Here i clicked Ctrl+Z
[2]+ Fermato updatedb
~# bg
[2]+ updatedb &
~#

Qui sopra ho lanciato ancora il comando updatedb, l’ho messo in pausa con la scorciatoia Ctrl+Z, ho lanciato il comando bg per mettere in background il comando in pausa.

Guarda qui:  Webcam di sicurezza e "motion detect" con Linux

Una lista dei processi in background

Si, ma non vorrei perdere il controllo. Quanti e quali processi ho mandato in background?

:~# jobs
[1]- In esecuzione sleep 500 &
[2]+ In esecuzione updatedb &
~#

Per riprendere un processo usiamo il comando fg insieme al numero relativo al processo che vogliamo ripristinare.

~# jobs
[1]-  In esecuzione           sleep 500 &
[2]+  In esecuzione           updatedb &
~# fg %2
updatedb

Ovviamente possiamo mettere nuovamente il comando appena ripristinato in background con Ctrl+Z e bg chiudendoci in un loop eterno.

Rendere persistente un processo anche alla chiusura della shell

Quando un processo è stato messo in background da una sessione, alla chiusura della sessione anche il processo terminerà. Questo aspetto può rappresentare un problema soprattutto nel caso di connessioni instabili (SSH).

La cosa più semplice in questi casi è usare screen, ma in generale se questo non è ciò che vogliamo possiamo rendere persistente un processo anche dopo la chiusura della sessione semplicemente dalla sessione con il comando nohup.

Tale comando è immune agli hang-up e può ignorare i segnali SIGHUP lanciati a un processo.

Il comando nohup va usato prima del processo che vogliamo “scollegare”.

~# nohup updatedb &

Ora possiamo terminare la sessione corrente, aprire un altro terminale e controllare che il processo sia ancora in esecuzione con ps ax | grep updatedb.


TheJoe

Mantengo questo blog a livello amatoriale dal 2009. Sono appassionato di grafica, tecnologia, software Open Source. Fra i miei articoli non sarà difficile trovarne circa la musica, ed alcuni di riflessioni personali, ma preferisco indirizzare la linea del blog principalmente verso la tecnologia. Per informazioni contattami.

0 commenti

Lascia un commento

Segnaposto per l'avatar

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.