Terminal multiplexing con Screen
Screen è un terminal multiplexer, cioè è un programma per eseguire più terminali indipendenti all'interno di una sola finestra. In un mondo ormai dominato dalle interfacce grafiche, dove si possono aprire più finestre di terminale contemporaneamente, questa funzionalità ha forse perso un po' della sua originaria utilità, ma in realtà screen ha anche altre funzioni estremamente utili, ad esempio permette di recuperare sessioni cadute per una disconnessione accidentale o volontaria del terminale.
Ma procediamo per gradi.
Installare screen
Installare screen su qualsiasi sistema Unix-like è facilissimo. Prima però occorre metabolizzare un concetto: dobbiamo installarlo sul server, non sulla macchina dove eseguiamo il client del terminale. E questo è ottimo perché consente di avere a disposizione le funzionalità a cui abbiamo accennato anche se come client per collegarsi alle macchine usiamo putty su Windows.
Vediamo qualche caso classico:
Ubuntu
$ sudo apt install screen
AMI Linux (AWS)
$ sudo yum install screen
FreeBSD
# pkg install screen
Lanciare screen
Una volta installato screen è immediatamente disponibile. Basta lanciarlo dalla command line:
$ screen
$
Su alcuni sistemi screen
da una schermata di benvenuto, per uscire dalla quale basta premere Invio.
Una volta avviato screen
solitamente non ci si accorge nemmeno di aver cambiato ambiente. Il terminale appare come sempre tranne per alcune segnalazioni che a volte appaiono nell'ultima riga dello schermo.
Proviamo però a digitare qualche comando e poi premiamo: Ctrl+a
e subito dopo c
: come per magia ci ritroveremo su un terminale pulito. Digitiamo ancora qualche comando e poi proviamo Ctrl+a
e poi 0
: ecco che siamo tornati al terminale precedente e tutto quanto abbiamo fatto al suo posto.
La filosofia generale di screen
Come avrete intuito le funzionalità speciali di screen si attivano premendo i tasti Ctrl+a
e poi un ulteriore carattere per il comando specifico che vogliamo eseguire. Vediamo alcuni esempi comuni:
Ctrl+a
c
: crea un nuovo terminaleCtrl+a
n
: passa al prossimo terminale attivoCtrl+a
0
: passa al terminale 0 - al posto di 0 si può usare un qualsiasi digit tra 0 e 9Ctrl+a
w
: visualizza sulla riga di stato un elenco dei terminali attiviCtrl+a
?
: visualizza la help page di screen con un elenco dei comandi di più frequente utilizzo
Split screen
Abbiamo visto come creare nuovi schermi di lavoro all'interno del nuovo terminale, ma se volessi mantenere due o più terminali visibili contemporaneamente sullo schermo potrei farlo usando la funzione di split screen.
In particolare premendo Ctrl+a
S
posso dividere il terminale in 2 parti per orizzontale. Attenzione: è una S maiuscola! Se invece preferisco vedere i due terminali affiancati posso usare Ctrl+a
|
.
Per passare da uno split screen all'altro si utilizza Ctrl+a
Tab
. In ogni "tab" aperta in questo modo posso usare i comandi che abbiamo visto qui sopra per creare una nuova sessione o per passare da una sessione all'altra.
Per chiudere una tab basta attivarla e poi usare il comando Ctrl+a
Q
(Q maiuscola).
Riassumendo:
Ctrl+a
S
: split screen orizzontaleCtrl+a
|
: split screen verticaleCtrl+a
Tab
: per muoversi da una tab all'altraCtrl+a
Q
: per chiudere la tab corrente
Salvare un log della shell
In qualsiasi momento è possibile creare un log di quanto avviene in una delle shell aperte con screen usando Ctrl+a
H
(H maiuscola!)
Ripetendo la stessa sequenza di comando si può fermare e riprendere il log.
Il file di log, per default, viene creato nella directory da cui si è lanciato il comando screen
, ma è possibile modificarne la posizione usando lo switch -Logfile
seguito dal nome del file di log.
Agganciare e sganciare i terminali
Come abbiamo detto all'inizio, una delle funzioni più interessanti di screen
è quella di poter lasciare un terminale aperto in background potendo riagganciarlo a piacere in qualsiasi momento.
Per sganciarsi da un terminale e lasciarlo attivo in background basta digitare in qualsiasi momento Ctrl+a
d
. Premendo questa sequenza di tasti si ritorna al terminale normale, ma screen
rimane in esecuzione con tutti i suoi terminali aperti.
Per sapere in qualsiasi momento se ci sono sessioni di screen
attive, basta usare lo switch -ls
, ad esempio:
$ screen -ls
There is a screen on:
4394.pts-0.maurizio-mint (22/05/2019 22:59:55) (Detached)
1 Socket in /run/screen/S-maurizio.
Questo comando visualizza le sessioni di screen attive per l'utente corrente, infatti ogni utente ha il suo ambiente di screen
.
A questo punto posso anche chiudere il terminale o la sessione ssh, le shell dentro screen
e i programmi in esse lanciati continueranno a girare tranquillamente, e potrò riagganciarle in qualsiasi momento usando screen
con lo switch -r
:
$ screen -r
La cosa bella è che il detach delle shell screen
avviene automaticamente anche nel caso in cui sia connesso via ssh e per qualche motivo cada la sessione. Anche in questo caso, ricollegandosi via ssh con lo stesso utente e usando il comando screen -r
possiamo ricollegare il terminale e continuare il lavoro senza perdere niente.
A volte può capitare che una sessione ssh si interrompa a causa della connessione di rete ma il server tardi ad accorgersene. Oppure potremmo voler terminare forzatamente un terminale screen
al quale non possiamo accedere e volerlo riagganciare da un altro terminale.
In questo caso possiamo usare screen -d
per forzare il detach di tutti i terminale, oppure screen -d -r
per eseguire il detach dell'altro terminale e poi riagganciarlo sulla sessione corrente.
Può anche accadere di avere più sessioni screen
contemporaneamente attive come in questo esempio:
$ screen -ls
There are screens on:
5930.pts-0.maurizio-mint (23/05/2019 00:18:42) (Detached)
5811.pts-0.maurizio-mint (23/05/2019 00:14:53) (Detached)
4394.pts-0.maurizio-mint (22/05/2019 22:59:56) (Attached)
3 Sockets in /run/screen/S-maurizio.
In questo caso possiamo riagganciare uno degli schermi utilizzando il suo id, ad esempio:
$ screen -r 5811
Riassumendo:
screen -ls
: elenca le sessioniscreen
attivescreen -d
: esegue il detach forzato delle sessioni attivescreen -r
: riaggancia una sessione attualmente in stato detachscreen -d -r
: forza lo sgancio di una session screen collegata ad un altro terminale e la aggancia a questoscreen -R
: apre screen cercando di riagganciare una sessione esistente, o se non ce ne sono crea una nuova sessione
Conclusioni
screen
è una di quelle utility di cui è veramente difficile fare a meno. E se avete qualche volta provato a lavorare su un server via ssh su un treno o in un qualsiasi posto con connettività instabile, sicuramente la pensate come me!
In questo caso installate screen
e lanciatelo subito, prima che la connessione cada, o meglio ancora fatelo partire direttamente all'inizio della sessione con:
$ ssh -t user@servername screen -R
Buon lavoro! :-)