Cookie

Il comando “screen” per emulare sessioni shell multiple

Pubblicato da TheJoe il

Tempo di lettura stimato: 4 minuti

Attenzione


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

Oggi vediamo come usare screen.

Di recente mi è capitato di dover lanciare dei comandi che prevedessero una durata molto lunga su un server remoto. Nel mio ultimo articolo, ad esempio, ho descritto come trasferire dati fra un vecchio NAS e un NAS moderno tramite FTP. In quel caso ho usato wget con l’argomento -b mettendo il processo in background così ho potuto scollegare la sessione SSH e il processo è continuato fino alla fine.

Per mettere in background un processo anche molto lungo è sufficiente aggiungere una & alla fine del comando. Purtroppo io sono molto sbadato e spesso mi aspetto che il comando restituisca un output in breve tempo, mentre nella realtà mi rendo conto che avrei risparmiato il mio tempo mettendo il carattere maledetto in fondo al comando. Un esempio?

~# updatedb &

Vogliamo parlare invece delle volte in cui abbiamo lanciato lo stesso tipo di comando, ma poi la connessione è caduta per le cause più disparate? A chi non è successo?

Per fortuna esiste screen che fa questo e molto altro… e ora lo vedremo.

Screen è in grado di gestire infinite finestre virtuali di terminali in una unica sessione. Ciò vuol dire che dovendo lanciare diversi comandi su una macchina remota non dovremo aprire una connessione SSH per ogni comando che lanciamo. In una sessione abbiamo la possibilità di infinite “finestre” virtuali e di infinite sessioni.

I processi di screen rimangono attivi anche quando chiudiamo la sessione principale, a meno che non li terminiamo volontariamente. Ciò significa che in caso di disconnessioni accidentali il processo andrà avanti fino alla fine e potremo riagganciarci alla sessione abbandonata senza dolori.

L’installazione

Screen è preinstallato su tutte le maggiori distribuzioni. Controlla di averlo fra i tuoi pacchetti.

~# screen --version
Screen version 4.08.00 (GNU) 05-Feb-20

Per architetture basate su apt:

~# apt install screen

Per architetture basate su rpm:

~# yum install screen

Avviare screen

Per avviare una sessione di screen basta scrivere screen in una console.

~$ screen

Questo comando creerà una sessione di screen, creerà una nuova finestra virtuale all’interno della sessione e avvierà una shell in quella finestra.

Ora che abbiamo avviato la sessione possiamo trovare una lista dei comandi digitando: Ctrl + a ?.

Ed ecco l’output:

                           Command key:  ^A   Literal ^A:  a

    break       ^B b           license     ,              removebuf   =         
    clear       C              lockscreen  ^X x           reset       Z         
    colon       :              log         H              screen      ^C c      
    copy        ^[ [           login       L              select      '         
    detach      ^D d           meta        a              silence     _         
    digraph     ^V             monitor     M              split       S         
    displays    *              next        ^@ ^N sp n     suspend     ^Z z      
    dumptermcap .              number      N              time        ^T t      
    fit         F              only        Q              title       A         
    flow        ^F f           other       ^A             vbell       ^G        
    focus       ^I             pow_break   B              version     v         
    hardcopy    h              pow_detach  D              width       W         
    help        ?              prev        ^H ^P p ^?     windows     ^W w      
    history     { }            quit        \              wrap        ^R r      
    info        i              readbuf     <              writebuf    >         
    kill        K k            redisplay   ^L l           xoff        ^S s      
    lastmsg     ^M m           remove      X              xon         ^Q q      

^]   paste .
"    windowlist -b
-    select -
0    select 0
1    select 1
2    select 2
3    select 3
4    select 4
5    select 5
6    select 6
7    select 7
8    select 8
9    select 9
I    login on
O    login off
]    paste .
|    split -v
:kB: focus prev

Dare un nome a una sessione

Una sessione rinominata è comoda quando dovremo richiamarla. Ad esempio rinominando una sessione “wget_debian” sapremo a colpo d’occhio guardando la lista delle sessioni attive che in quella sessione abbiamo lanciato il dowload della ISO di Debian.

~$ screen -S wget_debian

Familiarizzare con le finestre di screen

Quando avvii una sessione screen crea una finestra virtuale con una shell contenuta.

Guarda qui:  Una novità: "MPD"

Le finestre di screen non devono essere confuse con le sessioni. Una finestra (tutte le finestre che si voglia) è contenuta in una sessione, dalla quale ci si può scollegare senza che questa termini i processi contenuti.

Puoi avere svariate finestre in una sessione di screen.

Per creare una nuova finestra virtuale digita Ctrl+a c e il primo numero da 0 a 9 verrà assegnato.

Di seguito alcuni dei comandi più comuni per gestire le finestre di screen:

  • Ctrl + a c Crea una nuova finestra
  • Ctrl + a " Mostra una lista delle finestre
  • Ctrl + a 0 (zero) Passa alla finestra “0” (sostituire “0” con il numero relativo alla finestra voluta
  • Ctrl + a A Rinomina la finestra corrente
  • Ctrl + a S Divide la porzione di schermo in orizzontale
  • Ctrl + a | Divide la porzione di schermo in verticale
  • Ctrl + a tab Sposta il focus sulla regione successiva
  • Ctrl + a Ctrl + a Passa dalla finestra precedente alla seguente
  • Ctrl + a Q Chiude tutte le regioni
  • Ctrl + a X Chiude la regione corrente

Scollegare (detach) il proprio terminale dalla sessione corrente

Uno dei vantaggi, come già detto, è di poter continuare a lavorare lasciando che le sessioni di screen lavorino in background, mentre l’utente può lavorare su altro.

Ctrl + a d

Ricollegare (resume) il proprio terminale a una sessione

Per ripristinare il collegamento con una sessione abbandonata:

~$ screen -r

Qualora ci fossero più sessioni su un’unica macchina sarà necessario aggiungere anche l’ID della sessione dopo l’argomento -r.

Per trovare l’ID della sessione a cui ricollegarsi si usa il comando seguente:

~$ screen -ls
There are screens on:
13871.pts-3.joe-toshiba (29/11/2022 11:59:39) (Detached)
13836.pts-3.joe-toshiba (29/11/2022 11:59:20) (Detached)
13811.pts-3.joe-toshiba (29/11/2022 11:58:49) (Detached)
3 Sockets in /run/screen/S-joe.

Se vogliamo tornare alla sessione 13836.pts-3 digitiamo il comando:

~$ screen -r 13836

Conclusioni

Oggi abbiamo imparato a usare screen per creare finestre multiple da una singola sessione, navigare fra le finestra e per scollegarci e ricollegarci con le varie sessioni… ma c’è molto altro da imparare su screen.


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.