GNU/Screen

Da Guide@Debianizzati.Org.
Versione del 15 ott 2011 alle 09:10 di Skizzhg (discussione | contributi) (si procede a pezzetti)
Vai alla navigazione Vai alla ricerca
Document-page-setup.png Attenzione: questo articolo è ancora incompleto e in fase di scrittura da parte del suo autore.

Sentitevi liberi di contribuire, proponendo modifiche alla guida tramite l'apposita pagina di discussione, in modo da non interferire con il lavoro portato avanti sulla voce. Per altre informazioni si rimanda al template.


Introduzione

GNU/Screen è un multiplatore di terminale che esegue tanti "schermi" separati su un unico terminale, per questa ragione è paragonabile all'uso delle aree di lavoro (workspace) di un ambiente grafico e quindi possiamo considerarlo in un certo qual modo un Window Manager per applicazioni testuali e ncurses.


Installazione

Come sempre Debian rende tutto molto semplice:

# aptitude install screen

In un emulatore di terminale o in una tty lo avviamo quindi con:

$ screen


Le basi

Superato il noioso messaggio di benvenuto (che rimuoveremo più avanti) ci si ritrova al solito prompt e nulla sembra cambiato, purtroppo il non mostrare da subito una barra di stato è una delle pecche di screen e la sua stessa configurazione è piuttosto ostica.

È importante ricordare che screen è studiato per rimanere in funzione in background (non è il termine esatto ma credo renda l'idea) per cui impariamo subito i comandi di base. Qualsivoglia sia la ragione si potrebbe avere la tentazione di chiudere il terminale, aprirne un altro e avviare nuovamente screen; questo significa aprire una nuova sessione ma lasciare attiva la precedente, oltre che errato come concetto si rischia di ritrovarsi con un certo numero di sessioni abbandonate :)

screen usa un attivatore per tutte le altre funzioni, ovvero una prima sequenza di tasti che attendono una seconda, questo attivatore è di default Ctrl-a, per cui dire Ctrl-a : significa premere appunto Ctrl-a, rilasciare e quindi premere i due punti.

Innanzitutto rendiamoci la vita facile con la fantomatica statusbar, all'interno di screen digitate:

Ctrl-a :

Il cursore si sposterà al fondo dove appariranno i due punti, questo è il prompt dei comandi, per intenderci è simile alla modalità comando di Vim; da qui possiamo impartire vari comandi che al momento non abbiamo nel file di configurazione o, in altri casi, che vogliamo solo per la sessione in corso.

A questo punto, subito dopo i due punti, scriviamo:

hardstatus alwayslastline

e premiamo Invio.
Ora abbiamo una barra di stato, configuriamola in modo da avere un riscontro visivo delle finestre, questa volta dal prompt bash digitiamo:

screen -X hardstatus string "$(man screen | grep %-L)"

Invece del prompt di screen abbiamo usato la riga di comando, sia per mostrarvi un'altra caratteristica che per la sua versatilità; questi due sistemi non sempre sono uno l'alternativa dell'altro, l'opzione -X è particolarmente usata in script o per inviare comandi più complessi, è inoltre utilizzabile dall'esterno della sessione per inviare comandi remoti.

Abbiamo perciò inviato alla sessione il comando "hardstatus string" che richiede un argomento, e per comodità questo argomento è stato pescato direttamente dalla manpage, la stringa si presenta così:

%-Lw%{= BW}%50>%n%f* %t%{-}%+Lw%<

Come accennato in apertura, la sintassi è complessa e la affronteremo più avanti.

Ed ecco che la nostra statusbar, non particolarmente bella ma utile, si presenta come 0-$ bash, un rettangolino bianco su campo blu, mentre per il colore dell'intera barra viene usato il reverse (il contrario del colore di background usato dal terminale). La numerazione delle finestre parte da zero, ok è strano e con poco senso ma tant'è, ora apriamo un'altra finestra con un'altra istanza di bash:

Ctrl-a c

Ctrl-a è l'attivatore e c la scorciatoia per il comando screen, perché all'interno della sessione, screen apre una finestra che di default prende il nome dalla variabile d'ambiente SHELL.
Ora abbiamo due voci nella barra, la porzione blu indica la finestra attualmente in focus ed anche il suo aspetto "testuale" è diverso:

0$ bash  1-$* bash

Per passare da una finestra all'altra ci sono diversi metodi:

  • finestra specificata da [numero]: Ctrl-a [numero]
  • finestra successiva: Ctrl-a n (oppure Ctrl-a space)
  • finestra precedente: Ctrl-a p (oppure Ctrl-a backspace)
  • finestra visualizzata in precedenza: Ctrl-a Ctrl-a
  • lista selezionabile di finestre: Ctrl-a "


I comandi di uso comune hanno quasi tutti una scorciatoia ed è decisamente più comodo ma tutti sono comunque utilizzabili tramite il prompt, la manpage elenca tutte le scorciatoie predefinite e ogni singolo comando; leggetevelo con calma e, come vedremo più avanti, createvi nuove scorciatoie, anche sostituendo quelle predefinite che non ritenete utili.
In questa guida ne verranno illustrate solo alcune con qualche consiglio ed esempio su come migliorare l'usabilità; alcuni comandi hanno due combinazioni per cui è piuttosto facile eliminarne una e associarla ad altro, fate attenzione perché sono tutte case-sensitive.

Una breve legenda con le eventuali combinazioni create e quindi presenti nel file di configurazione si ottiene con:

Ctrl-a ?


Ogni finestra è rinominabile a piacimento con:

Ctrl-a A

Al prompt dei comandi apparirà la scritta "Set window's title to: bash", basta cancellare il nome attuale e scrivere il desiderato.

E se vogliamo rinumerarla:

Ctrl-a :number 

seguito da uno spazio e il nuovo numero.


Il metodo migliore per chiudere una finestra è terminare il processo in essa contenuto, solo in caso di problemi quali freeze o altro possiamo forzarne la chiusura (e uccidere il processo) con:

Ctrl-a k

Al prompt dei comandi apparirà il messaggio "Really kill this window [y/n]".


Visualizza data, hostname e carico del sistema (load average, quello solitamente mostrato dal comando uptime):

Ctrl-a t

Il messaggio apparirà in basso, sopra la statusbar, per alcuni secondi; per visualizzare l'ultimo messaggio di attività, qualunque esso sia, si usa:

Ctrl-a m

I messaggi di attività sono avvisi inviati da altre finestre in varie occasioni, se ad esempio abbiamo aptitude che lavora nella finestra zero e nel frattempo passiamo alla finestra uno per fare altro, quando aptitude finirà screen ci avvisa con "Activity in window %n", dove %n è sostituito dal numero della finestra.
Il tempo di visualizzazione è impostato a 5 secondi ed è configurabile, possono sembrare pochi ma si scoprirà che talvolta sono anche troppi in quanto durante tale periodo il processo contenuto nella finestra corrente viene in un certo modo bloccato.


"Non mi piace, è complicato, mi sono impantanato e voglio uscire da questo casino!", ovvero come chiudere screen.
La risposta è che è impossibile chiudere screen, non è stato concepito per essere terminato, perché usarlo altrimenti? ;)
Ma se proprio non potete farne a meno:

Ctrl-a C-\

Questa è nuova, che diamine è quel "C-\"? Come dicevo prima ci sono alcuni comandi che hanno una doppia scorciatoia, solitamente per renderla più difficile da digitare per errore, in questo caso significa premere Ctrl-a Ctrl-\ ma se volete davvero evitare brutte sorprese consiglio vivamente di eliminarla e usare il prompt quando occorre:

Ctrl-a :quit

Chiudere screen equivale ovviamente a chiudere tutte le finestre e terminare i processi della sessione, anche qui è consigliabile terminare i processi in modo pulito, almeno quelli importanti o che devono scrivere qualcosa su disco. In alternativa, terminato l'ultimo processo e chiusa l'ultima finestra terminerà anche screen e al prompt apparirà "[screen is terminating]".


Ma passiamo alle cose serie. screen deve restare attivo e insieme a lui tutto ciò che contiene, ma abbiamo bisogno di fare il logout (locale o via SSH), riavviare X, chiudere il terminale o altre operazioni esotiche (tranne riavviare la macchina); questa operazione si chiama detach, ovvero stacchiamo screen da quello che è di fatto il suo contenitore, xterm o tty che sia:

Ctrl-a d

E per riattaccarlo digitiamo al prompt bash:

$ screen -r

Nel caso avessimo più di una sessione staccata andrà specificata quale si vuole. Il precedente comando mostrerà quelle disponibili:

$ screen -r
There are several suitable screens on:
        4322.pts-17.jackinthebox        (15/10/2011 10:06:17)   (Detached)
        4088.pts-15.jackinthebox        (15/10/2011 10:00:17)   (Detached)
        4656.tty        (08/10/2011 01:00:48)   (Attached)
        1981.fugu       (07/10/2011 20:45:07)   (Attached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.

L'argomento può essere l'intera stringa o parte di essa, per cui tutte e tre le seguenti combinazioni andranno bene:

$ screen -r 4322.pts-17.jackinthebox
$ screen -r 4322
$ screen -r pts-17

Ma abbiamo altre due stringe curiose, quelle sono le sessioni che uso abitualmente. Per personalizzarne il nome basterà avviare screen con:

$ screen -S fugu

e l'attach avverrà allo stesso modo:

$ screen -r fugu

Se invece volessimo attaccare in un altro terminale o tty una sessione già attaccata useremo:

$ screen -x

Questo può essere utile se ci si collega da un'altra macchina o si vuole condividere la sessione con un altro utente, sebbene per quest'ultima ipotesi ci siano dei comandi appositi.


Utilizzando Ctrl-a per screen non sarà più possibile usare tale combinazione in bash per andare ad inizio riga (beginning-of-line) o in Vim o altrove; in realtà non è usabile direttamente ma con:

Ctrl-a a 

Il che, a seconda delle esigenze potrebbe essere scomodo, per cui possiamo eventualmente modificare l'attivatore ad esempio con un tasto nelle vicinanze come q oppure s che sono associati al flow control e non ci interessa assolutamente avere, a patto che non interferisca con altre applicazioni. A scelta si può avviare screen con tale opzione:

$ screen -e ^Ss

o inserire escape ^Ss nel file di configurazione.



Configurazione



skizzhg ven 14 ott 2011, 19.34.46, CEST