Terminal multiplexing con Screen

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+ae poi un ulteriore carattere per il comando specifico che vogliamo eseguire. Vediamo alcuni esempi comuni:

  • Ctrl+a c : crea un nuovo terminale
  • Ctrl+a n : passa al prossimo terminale attivo
  • Ctrl+a 0 : passa al terminale 0 - al posto di 0 si può usare un qualsiasi digit tra 0 e 9
  • Ctrl+a w : visualizza sulla riga di stato un elenco dei terminali attivi
  • Ctrl+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 orizzontale
  • Ctrl+a | : split screen verticale
  • Ctrl+a Tab : per muoversi da una tab all'altra
  • Ctrl+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 sessioni screen attive
  • screen -d : esegue il detach forzato delle sessioni attive
  • screen -r : riaggancia una sessione attualmente in stato detach
  • screen -d -r : forza lo sgancio di una session screen collegata ad un altro terminale e la aggancia a questo
  • screen -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! :-)

Currently there are no comments, so be the first!