Il comando screen

Tags: 

Il comando screen permette di avere una interfaccia tra un terminale fisico (in pratica: noi) e un comando (in genere la shell). Tale interfaccia, che agisce da proxy, permette anche ad altri terminali fisici di "agganciarsi".

In sostanza: possiamo interagire con la stessa shell da più terminali.

Screen fa molte altre cose: ad esempio agisce da vero e proprio "window manager di terminale", permettendo di avere in una sessione più finestre di shell aperte. Ma sono funzionalità che in questo articolo non verranno trattate.

  • Il motivo per cui uso screen è presto detto: ho 2 pc, uno a casa e uno a lavoro, che possono comunicare via internet. A volte mi capita di avviare un comando che ci mette molto tempo a terminare (update di sistema, compilazione...) in un pc, e voglio vedere il risultato del comando (o interagire con esso) dall'altro. Screen mi permette proprio questo.
  • Un altro utilizzo potrebbe essere quello dell'esecuzione di comandi complessi via cron: potremmo avere un modo per vedere cosa quei comandi stanno facendo, magari se si sono bloccati.

    Quando vogliamo iniziare una sessione di screen è sufficiente che digitiamo "screen" (dopo averlo installato, ovvio). Da quel momento in poi abbiamo creato un ambiente al quale possiamo collegarci anche da altri terminali, e tutto ciò che eseguiamo possiamo poi riprenderlo altrove.

    Visto che io sono pigro e smemorato, e mi dimentico sempre di avviarlo manualmente quando potrebbe servirmi, ho modificato il file .bashrc per far partire screen automaticamente in ogni terminale, aggiungendo:

    if [ "$STY" == "" ] ; then
       screen 
    fi
  • Avviarlo sempre può portare qualche inconveniente, in particolare quando vogliamo agganciare una sessione esistente (in pratica agganciamo una sessione da dentro un'altra sessione). Che è possibile senza problemi, ma può disorientare in alcune situazioni (meglio digitare "exit" per uscire da screen e poi agganciare). Oppure quando vogliamo uscire dal terminale: ci tocca digitare "exit" 2 volte. Ma sono questioni minori, almeno per me. Preferisco essere sicuro che tutto quello che faccio, senza pensarci prima, sia agganciabile.
  •  

    Questo un elenco dei comandi utili:

    screen -ls
      Mostra le sessioni aperte e collegate (attached) o scollegate (detached)

    echo $STY
      Mostra il pid della sessione attuale (se siamo dentro una) 

    screen -x [PID]
      Collega una sessione aperta e già collegata altrove, diventa "multi-window" (la vediamo da piu' parti). Poi possiamo usare "Ctrl+a, d" per uscire lasciando collegate le altre.
      Da notare che se PID è scollegata, la collega comunque (come -r). Quindi può convenire sempre usare -x

    screen -r [PID]
      Ricollega una sessione aperta ma scollegata (detached). Ma preferisco usare "-x" per i motivi detti sopra.

    screen -d -m [COMMAND]
      Esegue il comando in una nuova sessione, staccata (se tolgo -d usa la sessione attuale creando una nuova finestra, se c'è). Utile (anche senza -d) in cron. Quando il comando finisce chiude anche la sessione (o finestra senza -d)

    Ctrl+a, d
      Scollega la sessione attuale (ma la lascia aperta). Utile anche se siamo in multi-window (screen -x) per uscire lasciando collegate le altre finestre

    Ctrl+a, ESC
      Va in modalità scrollback mode: con i cursori possiamo tornare indietro nell'output (per vedere cosa ha scritto l'ultimo comando se non sta nella pagina). Con ESC torniamo alla command line

    Ovviamente per vedere tutti le possibilità di comandi, sequenze di escape... basta guardare il man...

     

    Per concludere, questo lo ~/.screenrc che uso io, giusto per migliorare un pelo quello base:

    startup_message off
    defscrollback 10000
    term screen-256color
    hardstatus off
    hardstatus alwayslastline
    hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}]'
    termcapinfo xterm* ti@:te@

    Aggiungi un commento