Amministrazione server facilitata con screen


icona del terminale GNU/Linux Il comando/programma screen è uno di quegli strumenti software di GNU/Linux utilissimi, ma poco conosciuti. Questo perché i manuali o gli esempi che si trovano in Internet sono pieni zeppi di opzioni e parametri, e difficilmente si arriva alla fine degli articoli capendo quale sia l’utilità. Anche il man, spesso utilissimo per descrivere i parametri di un comando, in questa situazione non ci viene incontro.

E’ di gran lunga meglio illustrare il suo funzionamento tramite esempi.

A grandi linee

Il comando screen fa una cosa semplice quanto potente: crea un ambiente di virtualizzazione di terminali, gestibile come una sessione, alla quale l’utente si può agganciare o sganciare.

L’effetto pratico che otteniamo è che ci si può collegare ad un server remoto tramite una shell remota (ssh in genere), lanciare un programma e lasciarlo girare anche una volta scollegati. E, quando volessimo ricollegarci al precedente server, possiamo rientrare in sessione e vedere cosa sia successo. Si possono anche eseguire più terminali nella stessa sessione.

Un’ulteriore favolosa caratteristica è che 2 o più utenti possono agganciarsi alla stessa sessione: in questo modo entrambi “vedono” la stessa shell che si aggiorna dinamicamente durante la scrittura.

screenshot di una sessione screen - client remminaNota: se avete una delle ultime Ubuntu, potreste avere uno screen leggermente più evoluto; si presenta con due righe in fondo allo schermo virtuale, ha un menù, è possibile cambiare tema, ed altre carinerie simili. Ma il funzionamento è identico alla versione “classica”. (vedi immagine)

Programmi sempre in funzione, anche a fine sessione remota

Per amministrare un server in genere ci colleghiamo in accesso remoto (ssh, con cos’altro se no?). Bene. Prima o poi dovremo chiudere la shell: perché vogliamo scollegarci, perché cade la connessione, perché mettiamo il portatile in sospensione dimenticandoci del terminale remoto aperto…. in qualunque di queste situazioni, tutti i programmi lanciati nella sessione ssh saranno terminati, in quanto processo figlio della shell remota.

Con screen possiamo fare in modo di lasciare il programma in esecuzione e riprendere quando vogliamo!

Ecco come fare:

  1. entrare con ssh nella macchina remota (ma per prova, potete anche testare ssh localhost)
  2. lanciare screen (se non lo avete, installate il pacchetto): comparirà un messaggio contenente la licenza, dal quale si esce premendo invio; ora avete, davanti a voi un nuovo terminale. Sembra che non sia successo niente, ma in realtà siamo in una sessione screen, e quello davanti è il nostro (per ora) unico terminale virtuale.
  3. avviamo il comando top;
  4. ora possiamo sganciarci dalla sessione premendo CTRL+a e poi d (d=detach): ritorneremo alla shell dalla quale abbiamo lanciato il comando screen

Ora possiamo anche uscire dalla connessione remota ssh. La “magia” sta nel fatto che 1° – top sta ancora “girando” e 2° – possiamo ricollegarci alla sessione dove l’avevamo lasciata.

Per rientrare in sessione:

  1. entrare di nuovo in ssh nella macchina remota di prima
  2. lanciare il comando screen -r: è il modo per fare il resume di una sessione screen; vedrete top in funzione…. e il bello è che non ha mai smesso di funzionare!
  3. possiamo chiudere il terminale e la sessione allo stesso modo in cui si chiude una shell:
    • dando un exit
    • premendo CTRL+d (che equivale ad un EOF al terminale)
    • con lo specifico comando di screen, CTRL+a e k (k=kill). Quest’ultimo è “brutale”, i precedenti 2 sono da preferire.

Niente male, vero? Ma facciamo un altro esempio

Un solo ambiente, più terminali

Un’altra funzionalità davvero utile è la possibilità di aprire più di un terminale all’interno della stessa sessione.

Recentemente ho sviluppato un programma server che scrive nello stdout alcune informazioni; contemporaneamente scrive in un file di log informazioni più dettagliato. In questo caso è possibile:

  1. entrare con ssh nella macchina remota (ma per prova, potete anche testare ssh localhost)
  2. lanciare screen (o, se la precedente sessione non è stata chiusa, screen -r)
  3. mandare in esecuzione il proprio programma
  4. ora possiamo aggiungere un nuovo terminale premendo CTRL+a e poi c (c=create): si aprirà una nuova shell/console in cui possiamo dare il comando tail -f /path/to/logfile.log

Per passare da una shell all’altra abbiamo le seguenti combinazioni di tasti:

  • CTRL+a e n (n=next): ci sposta alla console successiva;
  • CTRL+a e p (p=previous): ci sposta alla console precedente;
  • CTRL+a seguito da un numero (0, 1, 2, …) ci aprirà direttamente la console n-esima

Sessione condivisa

Infine, vediamo una delle caratteristiche più particolari.

Mentre siamo collegati ad una sessione screen, possiamo far collegare qualcun altro (un collega, un allievo, …) che può vedere ed interagire con la nostra stessa sessione.

Farlo è piuttosto semplice. Lanciare in un terminale una sessione screen o rientrare con screen -r; a questo punto, apriamo un altra console ed entriamo nella sessione con screen -x. Avendo entramebe i terminali aperti possiamo notare che, scrivendo in uno, vedremo comparire i caratteri anche nell’altro. Fenomenale!

Conclusioni

Non finisce certo qui. Infatti possiamo anche fare log su file dei comandi da noi inseriti in sessione. Questo è davvero utile se si desidera avere uno storico di amministrazione di un server, ad esempio. Però credo che, ora che avete una guida di base, è possibile scoprire da soli le funzionalità più particolari ed avanzate di questo ottimo strumento.

Queste le combinazioni e i parametri di screen più utili:

  • apre una sessione screen: screen
  • mostra i terminali virtuali aperti: screen -ls
  • apre/crea un nuovo terminale in screen: CTRL-a + c
  • uccide la sessione, inclusi tutti i terminali virtuali in essa contenuti: CTRL-a + k
  • apre un semplice menù, contenente l’elenco dei terminali attualmente attivi nella sessione: CTRL-a + (doppi apici)
  • cambiare il nome ad un terminale virtuale può essere utile se si utilizza il precedente menù oppure si utilizza lo screen più evoluto presente in alcune distribuzioni come Ubuntu: CTRL-a + A
  • si muove al terminale precedente o successivo tra tutti quelli aperti: CTRL-a + p o + n:
  • detach, ossia esce dalla sessione: CTRL-a + d
  • close and detach, ci si scollega in maniera pulita dalla sessione screen e chiude anche la shell che la contiene; la sessione rimane comunque attiva: CTRL-a + DD
  • riaggancia la sessione screen: screen -r
  • entrare in una sessione condivisa: H

Se avete segnalazioni da fare, correzioni da suggerire o domande, usate lo spazio commenti.

Saluti

, , , , ,

9 comments on “Amministrazione server facilitata con screen

  1. Keryshan on said:

    Ciao,
    anzitutto complimenti per la guida, perche’ effettivamente (e purtroppo) screen non lo conosce quasi nessuno…
    premettendo che non sono un amministratore di sistema volevo capire cosa significa avere piu’ sessioni attaccate… per esempio io mi loggo via ssh su una macchina remota e poi:

    keltron@martini:~–> screen -ls
    There are screens on:
    20924.pts-0.martini (16/06/2012 09:41:08) (Attached)
    22635.pts-1.martini (15/06/2012 18:54:47) (Attached)
    22222.pts-1.martini (15/06/2012 18:52:16) (Attached)
    3 Sockets in /var/run/screen/S-keltron.

    cosa significa che ne ho 3 Attached sullo stesso pc??
    e se in particolare in una stessi facendo girare un programma, e volessi entrare in quella specifica sessione per vedere se il programma sta ancora girando??
    (se mi sono espresso male sgridami pure!!).

    Ovviamente grazie mille per l’attenzione!

  2. Date un occhio anche TMUX, lo reputo migliore sopratutto quando si spezza il terminale in due o più sotto terminali

  3. Severus on said:

    Se siete interessati a screen vi consiglio di guardare anche byobu e tmux

    • Grazie per aver suggerito queste 2 alternative.
      Le ho volute provare subito.
      Byobu e assomiglia moltissimo alla versione screen di Ubuntu. Non ho ben chiaro se byobu sia derivato da screen o se il comando screen di Ubuntu sia un fork di byobu. Comunque, effettivamente, si può utilizzare byobu al posto di screen: i comandi sono gli stessi con, in aggiunta, alcune caratteristiche come il menù, la barra informativa ed altro.
      Tmux: wow! è davvero fico! Non lo conoscevo: non è niente male. A differenza di screen permette di avere tutti i terminali sulla stessa schermata (davvero un’ottima feature!). Credo che inizierò ad usarlo (per chi desidera iniziare, tenete presente che CTRL-b è la sequenza per inviare il comando; leggete il man alla sezione KEY-BINDINGS per l’elenco dei comandi possibili.

      • Keryshan on said:

        Forse mi confondo, ma anche screen offre la medesima possibilita’, splittando il terminale in regioni. Poi in ogni regione si puo’ lavorare come se fosse un terminale a se (io ho iniziato a usare screen per questa opzione).

  4. Michele on said:

    Grazie! Era da qualche giorno che cercavo di capire come funziona screen senza saltarci fuori. Il tuo tutorial è semplice ed efficace: sono diventato subito operativo :-)

  5. Grande! Mi sa che lo stampo per tenerlo dietro al monitor a portata di sguardo :D

  6. yuri on said:

    I miei più sentiti complimenti!
    Hai spiegato benissimo tant’è che io sono riuscito a capire! ;) Grazie!

Lascia un Commento

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>