GNU/Screen: differenze tra le versioni

nessun oggetto della modifica
Nessun oggetto della modifica
Riga 1: Riga 1:
{{Stub}}
{{Stub}}
== Introduzione ==
== Introduzione ==
<code>GNU/Screen</code> è 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.
<code>GNU/Screen</code> è 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.<BR>
Risulta dunque lampante la sua utilità in sistemi privi di ambiente grafico, dove non è appunto possibile avviare N finestre di terminale per eseguire N differenti applicativi/comandi.
Risulta dunque lampante la sua utilità in sistemi privi di ambiente grafico, dove non è appunto possibile avviare N finestre di terminale per eseguire N differenti applicativi/comandi.


== Installazione ==
== Installazione ==
Come sempre Debian rende tutto molto semplice:
Come sempre Debian rende tutto molto semplice:
# aptitude install screen
<pre># aptitude install screen</pre>


In un emulatore di terminale o in una tty lo avviamo quindi con:
== Utilizzo ==
$ screen
<code>GNU/Screen</code> ha due tipi di utilizzo, tramite interfaccia e tramite riga di comando; premesso che visivamente la differenza è minima si può affermare che la prima modalità risulta prevalentemente utile in tutti quei casi dove è richiesta interazione con l'utente, mentre la seconda dove ciò non è vero, per esempio nell'esecuzione di script o di servizi come CRON.
{{Box|IMPORTANTE|È possibile creare '''m''' sessioni di <code>GNU/Screen</code> e per ciascuna di esse '''n''' schermi}}


 
=== Modalità Interfaccia ===
== Le basi ==
Per avviare <code>GNU/Screen</code> è sufficiente digitare in un emulatore di terminale o in una tty quanto segue:
<pre>$ screen</pre>
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.
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 :)
È 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 :)


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


Riga 40: Riga 41:
Come accennato in apertura, la sintassi è complessa e la affronteremo più avanti.
Come accennato in apertura, la sintassi è complessa e la affronteremo più avanti.


 
==== Scorciatoie e messaggi ====
=== Scorciatoie e messaggi ===
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 e foreground 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:
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 e foreground 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 c
Riga 55: Riga 55:
* finestra visualizzata in precedenza: '''Ctrl-a Ctrl-a'''
* finestra visualizzata in precedenza: '''Ctrl-a Ctrl-a'''
* lista selezionabile di finestre: '''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. <br>
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. <br>
Riga 62: Riga 61:
Una breve legenda con le eventuali combinazioni create e quindi presenti nel file di configurazione si ottiene con:
Una breve legenda con le eventuali combinazioni create e quindi presenti nel file di configurazione si ottiene con:
  Ctrl-a ?
  Ctrl-a ?


Ogni finestra è rinominabile a piacimento con:
Ogni finestra è rinominabile a piacimento con:
Riga 73: Riga 71:


seguito da uno spazio e il nuovo numero.
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:
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:
Riga 79: Riga 76:


Al prompt dei comandi apparirà il messaggio "Really kill this window [y/n]".
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):
Visualizza data, hostname e carico del sistema (load average, quello solitamente mostrato dal comando uptime):
Riga 90: Riga 86:
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.
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.


 
==== Chiusura ====
=== Chiusura ===
"Non mi piace, è complicato, mi sono impantanato e voglio uscire da questo casino!", ovvero come chiudere screen. <br>
"Non mi piace, è complicato, mi sono impantanato e voglio uscire da questo casino!", ovvero come chiudere screen. <br>
La risposta è che è impossibile chiudere screen, non è stato concepito per essere terminato, perché usarlo altrimenti? ;) <br>
La risposta è che è impossibile chiudere screen, non è stato concepito per essere terminato, perché usarlo altrimenti? ;) <br>
Riga 102: Riga 97:
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]".
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]".


 
==== Detach e sessioni ====
=== Detach e sessioni ===
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:
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
  Ctrl-a d
Riga 137: Riga 131:
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.
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.


 
==== Escape ====
=== Escape ===
Utilizzando <code>Ctrl-a</code> 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:
Utilizzando <code>Ctrl-a</code> 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  
  Ctrl-a a  
Riga 147: Riga 140:
o inserire <code>'''escape ^Ss'''</code> nel file di configurazione.
o inserire <code>'''escape ^Ss'''</code> nel file di configurazione.


 
==== Split ====
=== Split ===
Una delle caratteristiche principali di screen è la possibilità di dividere la finestra in più porzioni proprio come un Window Manager tiling o gli split di Vim, queste prendono il nome di regioni. <br>
Una delle caratteristiche principali di screen è la possibilità di dividere la finestra in più porzioni proprio come un Window Manager tiling o gli split di Vim, queste prendono il nome di regioni. <br>
Per dividere orizzontalmente si usa:
Per dividere orizzontalmente si usa:
Riga 155: Riga 147:
Mentre per lo split verticale:
Mentre per lo split verticale:
  Ctrl-a |
  Ctrl-a |


A questo punto la regione in focus è trattata come una finestra, perché questo è lo scopo degli split: avere più finestre a vista contemporaneamente. Le scorciatoie per cambiare finestra sono le stesse ma valgono solo per quella regione, per muoversi invece tra una regione e l'altra useremo la combinazione:
A questo punto la regione in focus è trattata come una finestra, perché questo è lo scopo degli split: avere più finestre a vista contemporaneamente. Le scorciatoie per cambiare finestra sono le stesse ma valgono solo per quella regione, per muoversi invece tra una regione e l'altra useremo la combinazione:
Riga 202: Riga 193:
Inoltre non sono comandi documentati, per cui date un'occhiata ai [http://git.savannah.gnu.org/cgit/screen.git/tree/src/doc/screen.1#n2262 sorgenti].
Inoltre non sono comandi documentati, per cui date un'occhiata ai [http://git.savannah.gnu.org/cgit/screen.git/tree/src/doc/screen.1#n2262 sorgenti].


 
==== Copia e incolla ====
=== Copia e incolla ===
La gestione del testo è una delle caratteristiche più importanti e potenti, sebbene sia usabile in un emulatore di terminale e in X, ricordiamoci che screen nasce come applicazione mouseless ed è qundi provvista di tutto (o quasi) ciò che serve per renderla funzionale senza click.
La gestione del testo è una delle caratteristiche più importanti e potenti, sebbene sia usabile in un emulatore di terminale e in X, ricordiamoci che screen nasce come applicazione mouseless ed è qundi provvista di tutto (o quasi) ciò che serve per renderla funzionale senza click.


Riga 230: Riga 220:


L'ultima riga è '''davvero importante''' perché riattiviamo il file predefinito per lo scambio <code>/tmp/screen-exchange</code>, altrimenti utilizzando successivamente <code>Ctrl-a ></code> verrà usato <code>/etc/screenrc</code> e, sebbene non avremo i permessi per scriverci, di certo non lo vogliamo; se il file fosse un altro e ne avessimo accesso in scrittura, questo verrebbe sovrascritto. Usate questo sistema con cautela.
L'ultima riga è '''davvero importante''' perché riattiviamo il file predefinito per lo scambio <code>/tmp/screen-exchange</code>, altrimenti utilizzando successivamente <code>Ctrl-a ></code> verrà usato <code>/etc/screenrc</code> e, sebbene non avremo i permessi per scriverci, di certo non lo vogliamo; se il file fosse un altro e ne avessimo accesso in scrittura, questo verrebbe sovrascritto. Usate questo sistema con cautela.


Oltre a questo possiamo fare un dump di ciò che è contenuto nello schermo (la parte visibile del buffer) senza bisogno di scroll:
Oltre a questo possiamo fare un dump di ciò che è contenuto nello schermo (la parte visibile del buffer) senza bisogno di scroll:
Riga 237: Riga 226:
Apparirà il messaggio "Screen image written to hardcopy.n"", dove '''n''' sarà il numero della finestra; il file è creato in PWD, il path da dove è stato avviato screen. Se l'opzione '''hardcopy_append on''' non è specificata, il file viene sovrascritto ad ogni utilizzo.
Apparirà il messaggio "Screen image written to hardcopy.n"", dove '''n''' sarà il numero della finestra; il file è creato in PWD, il path da dove è stato avviato screen. Se l'opzione '''hardcopy_append on''' non è specificata, il file viene sovrascritto ad ogni utilizzo.


=== Modalità riga di Comando ===
Come inizialmente anticipato è possibile sia inviare comandi che eseguire applicativi in ciascuno dei vari schermi di <code>GNU/Screen</code> precedentemente creati senza per questo essere obbligati a riportare in primo piano ciascuno di essi.
{{Warningbox|I seguenti esempi NON devono essere eseguiti all'interno di sessioni screen eventualmente già attive, ma dal proprio terminale "base".}}
Si noti che terminata l'esecuzione del comando ci si ritroverà ancora davanti al proprio terminale "base" e non all'interno di una sessione di <code>GNU/Screen</code>
<br>
Creare una sessione di nome ''sessione1''
<pre>screen -m -d -S sessione1</pre>
Seleziona una finestra (accetta sia numero che nome):
$ screen -X select 1
Rinumera finestra (-p accetta sia numero che nome):
$ screen -p 9 -X number 11
Rinomina finestra:
$ screen -p 9 -X title zut
Il comando '''stuff''' invia una stringa come input e ci permette di eseguire comandi esterni.
Esegue il comando '''ls''' (^M si ottiene con <code>ctrl-v Return</code>):
$ screen -p 0 -X stuff 'ls ^M'
Alternativa (utile per script o altre situazioni in cui ''^M'' non è applicabile):
$ screen -p 0 -X stuff $'ls\n'
Il comando '''at''' esegue un comando su più finestre.
Esegue il comando '''ls''' a tutte le finestre chiamate bash:
$ screen -X at bash# stuff 'ls ^M'
Esegue il comando '''ls''' a tutte le finestre chiamate bash e alla finestra l10n:
$ screen -X eval 'at bash# stuff "ls ^M"' 'at l10n# stuff "ls ^M"'
Esegue il comando '''ls''' alle finestre zero e nove:
$ screen -X eval 'at 0# stuff "ls ^M"' 'at 9# stuff "ls ^M"'
Esegue il comando '''ls''' a tutte le finestre:
$ screen -X at \# stuff 'ls ^M'


== Configurazione ==
== Configurazione ==
La configurazione avviene tramite il file <code>~/.screenrc</code> o altro percorso se specificato con l'opzione '''-c'''. <br>
Se l'utente lo desidera è possibile personalizzare <code>GNU/Screen</code> tramite il file di configurazione <code>~/.screenrc</code> o altro percorso se specificato con l'opzione '''-c'''. <br>
Di seguito riporto il mio di esempio con i relativi commenti, come vedete sono state sfruttate combinazioni esistenti e non per rendere piacevole e veloce l'uso quotidiano.
Di seguito se ne riporta uno d'esempio con i relativi commenti, pensato per sfruttare combinazioni esistenti e non al fine di rendere piacevole e veloce l'uso quotidiano.


<pre>
<pre>
Riga 320: Riga 348:
# questo non significa sia comprensibile o semplice ma ci sono un sacco di esempi in rete dai quali prendere spunti
# questo non significa sia comprensibile o semplice ma ci sono un sacco di esempi in rete dai quali prendere spunti
  hardstatus alwayslastline "%{= kB}%{= 9}%?%-w%?%{G}[%{B}%n %t%?(%u)%?%{G}]%{d}%+w%?%?%= %{g}%c %D %d-%m-%y"
  hardstatus alwayslastline "%{= kB}%{= 9}%?%-w%?%{G}[%{B}%n %t%?(%u)%?%{G}]%{d}%+w%?%?%= %{g}%c %D %d-%m-%y"


# le scorciatoie che non hanno un argomento vengono eliminate, disfiamoci di roba fastidiosa che potrebbe
# le scorciatoie che non hanno un argomento vengono eliminate, disfiamoci di roba fastidiosa che potrebbe
Riga 395: Riga 422:
  select 0
  select 0
</pre>
</pre>


Dopo aver fatto modifiche al file di configurazione possiamo ricaricarlo senza chiudere la sessione:
Dopo aver fatto modifiche al file di configurazione possiamo ricaricarlo senza chiudere la sessione:
  Ctrl-a :source .screenrc
  Ctrl-a :source .screenrc
== Uso avanzato e riga di comando ==
Come si è visto all'inizio, ci sono alcune opzioni usabili da riga di comando per controllare la sessione e inviare istruzioni anche dall'esterno, sia comandi di screen sia altri programmi. Vediamo qualche esempio.
Seleziona una finestra (accetta sia numero che nome):
$ screen -X select 1
Rinumera finestra (-p accetta sia numero che nome):
~$ screen -p 9 -X number 11
Rinomina finestra:
$ screen -p 9 -X title zut
Il comando '''stuff''' invia una stringa come input e ci permette di eseguire comandi esterni.
Esegue il comando '''ls''' (^M si ottiene con <code>ctrl-v Return</code>):
$ screen -p 0 -X stuff 'ls ^M'
Alternativa (utile per script o altre situazioni in cui ''^M'' non è applicabile):
$ screen -p 0 -X stuff $'ls\n'
Il comando '''at''' esegue un comando su più finestre.
Esegue il comando '''ls''' a tutte le finestre chiamate bash:
$ screen -X at bash# stuff 'ls ^M'
Esegue il comando '''ls''' a tutte le finestre chiamate bash e alla finestra l10n:
$ screen -X eval 'at bash# stuff "ls ^M"' 'at l10n# stuff "ls ^M"'
Esegue il comando '''ls''' alle finestre zero e nove:
$ screen -X eval 'at 0# stuff "ls ^M"' 'at 9# stuff "ls ^M"'
Esegue il comando '''ls''' a tutte le finestre:
$ screen -X at \# stuff 'ls ^M'




2 906

contributi