Lanciare programmi dal terminale di ubuntu che abbiano vita autonoma

Normalmente quando richiamiamo un programma dalla linea di comando lo usiamo e quando abbiamo finito torniamo alla linea di comando pronti ad usare il programma sucessivo.

Tuttavia viene sempre il momento che si vuole lanciare un programma dalla linea di comando in maniera autonoma: facendo cioè in modo di tornare subito alla linea di comando lasciando il programma appena lanciato in esecuzione (vogliamo ad esempio ascoltare un pò di musica mentre lavoriamo).La prima cosa che mi viene in mente è l’operatore “&” che fà quanto detto, ad esempio con: <nome programma> &.

Il primo problema però è che eventuali dati che il programma scrive sia su stdout che su stderr vengono comunque inviati alla linea di comando “padre” del programma lanciato, ed ovviamente crea non poca confusione al povero operatore che si vede comparire scritte “dall’aldilà”.

Bè poco male dite voi aggiungiamo un “/dev/null” che istruisce il sistema operativo a gettare nel cestino tutto quanto scritto su stdout e magari prima aggiungiamo un “2>&1” che indica che lo stderr deve essere reindirizzato su stdout: a questo punto tutto quanto scritto dal programma sul terminale viene gettato via e noi possiamo continuare a lavorare in pace.

Però tutto questo lavoro ha richiesto il suo tempo ed è venuto il momento di chiudere questa benedetta linea di comando e di godersi un pò di riposo magari finendo di ascoltare la musica che avevamo messo sù poco prima e proprio quando digitiamo exit che ci accorgiamo che la linea di comando manda un segnale  (SIGHUP) a tutti i processi figli per dirgli che anche loro devono chiudere. Come risolvere ?

Il comando “nohup” anteposto al momento dell’esecuzione indica al programma di ignorare la notifica del SIGHUP.

Se ci siamo dimenticati il “nohup” al momento del lancio possiamo sempre usare il comando “disown” per indicare alla shell (non al programma come con nohup) il programma a cui NON notificare il SIGHUP: se non indichiamo nulla significa che il programma che vogliamo escludere dalla notifica è l’ultimo in ordine di esecuzione.

Tutto a posto quindi direte voi ? Ni ! Il fatto è che con nohup viene comunque creato un file nella home dell’utente (~/nohup.out ) contenente l’output del programma in oggetto: ora è vero che noi usando la redirezione dell’output di cui sopra e non scriviamo nulla sul file ma da una parte è comunque spiacevole che quel file venga creato e dall’altra è troppo facile scivolare nell’errore di dimenticarsi la redirezione e generare file che possono anche raggiungere dimensioni problematiche… quindi ? Per fortuna una soluzione c’è:

Usando “setsid <nome programma>” generiamo un albero di processi parallelo e finalmente posiamo goderci la nostra musica in pace anche se ormai è tempo di spegnere il computer…

Alla prossima

Andrea

Lascia un commento