screen - nohup

screen è un moltiplicatore di terminali (pessima traduzione di terminal multiplexer). L'ho sempre utilizzato per lanciare dei calcoli matlab su un server remoto (a cui sono connesso via ssh),  chiudendo poi la sessione su client, in modo da non interrompere sul server il processo matlab.

In sostanza, se mi collego via ssh a un server e lancio un processo in background, questo è figlio della sessione ssh che si viene a creare. Quando chiudo la sessione ssh il processo figlio muore col padre.

In questo caso ho lanciato vim in background (PID 27102) e come si può vedere è figlio di bash e della sessione ssh. Quando vado a chiudere brutalmente la finestra del terminale sul mio client, il processo vim muore insieme alla sessione ssh.

Per evitare questo tipo di problemi vado ad utilizzare un programma chiamato screen.

1: Dal mio client mi collego a server.
3: Creo una sessione di screen chiamata "manowar" e all'interno di essa
4: vado a lanciare il comando top, poi
5: stacco la sessione screen e tutto ciò che ci gira all'interno dal terminale "vero" (detach, tramite la combinazione di tasti CONTROL-a d) e mi ritrovo quindi collegato normalmente al server.
8-11: Creo un'altra sessione di screen chiamata "maiden" all'interno della quale lancio il comando tail -f /var/log/Xorg.0.log, poi stacco screen dal terminale.
13: Elenco le sessioni di screen attive e mi ritrovo proprio
15: manowar e
16: maiden.
19: Mi scollego dal server.
23: Mi ricollego al server via ssh.
24: Per sicurezza elenco nuovamente le sessioni di screen attive: ci sono ancora (25-28).
30: Lancio pstree e  vedo la differenza rispetto a prima. Ora i comandi "top" e "tail" sono figli delle 2 sessioni di screen
31: 27541 e
32: 27575.
33: La sessione attuale ssh non ha top e tail tra i suoi figli.
35: Riattacco la sessione manowar al terminale corrente,
36: mi ritrovo il comando top ancora perfettamente funzionante ; lo chiudo con control-c e
37: esco.
39: Mi ritrovo nel terminale vero (della sessione ssh corrente). Elenco le sessioni screen attive, e ne ritrovo, giustamente, soltanto una, ovvero
41: maiden.
44-48: Mi attacco alla sessione maiden, fermo il comando tail e termino la sessione di screen.


nohup (no-hangup) è un programma che permette di lanciare altri programmi ignorando il segnale di hangup (SIGHUP). Questo è il segnale che ricevono i processi figli di un terminale controllante che si chiude.
Di default lo standard output e lo standard error del programma lanciato con nohup vengono ridirezionati in nohup.out, nella stessa directory in cui lancio il programma.

1: Lancio il programma "tail -f /var/log/temper.log" tramite il comando nohup e lo mando in background.
4: Guardo se il programma è in esecuzione e lo trovo.
7: Osservo lo standard output del comando tail che è stato ridirezionato in nohup.out, sono le
8-9: temperature registrate dal termometro.

 


Nota:
Se screen da problemi col terminale è perchè il client, quando faccio ssh verso il server, esporta la variabile TERM e magari sul server non c'è il corrispondente terminale.

Per esempio qui
utente@client:]# export |grep TERM
declare -x COLORTERM="xfce4-terminal"
declare -x TERM="xterm-256color"

Vado sul server e in
/usr/share/terminifo/x
xterm-256color non c'è.

Allora sul server guardo quali terminali ci sono
ls /usr/share/terminfo/x

e poi lancio (sul client)
export TERM=un_terminale_che_trovo_sul_server

Print Friendly, PDF & Email