3 155
contributi
Wtf (discussione | contributi) |
Wtf (discussione | contributi) 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: | ||
<pre># aptitude install screen</pre> | |||
== Utilizzo == | |||
<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 === | |||
== | 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 == | ||
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 | 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 | ||
contributi