In this post I introduce you to the program GNU screen.
This program can be used to have multiple "terminal windows" within a terminal session, enabling this way, a sort of "multitasking".

In questo post vi introdurrò al programma GNU screen.
Questo programma si può usare per avere molteplici "finestre di terminale" all'interno di una sessione di terminale, abilitando così, una sorta di "multitasking".

GNU screen: introduction to "multitasking" in terminal sessions

In the previous post, I talked about how to disable the internal monitor of the laptop in grub and use external vga monitors instead.
I explained that because that's what happened to me: my laptop's monitor stopped working properly.

Unfortunately for me, I cannot always connect to external monitors.
Of course, if I can, I avoid using the computer in the first place, but most of the times I need to, and in those cases I use another technique.

The ones who follow this blog (at least) since December 2014 will remember the VNC and SSH basic setup on Linux video post.
In that post I dealt with a simple installation and configuration of the two mentioned protocols on Linux distributions.

The "alternative technique" involves the use of a ssh server:
Basically, I set up Debian to automatically connect to the wireless lan and start the ssh server at boot time.
Once Debian boots, all I have to do is to connect from a client (usually my Galaxy Tab).
If I need the graphical interface, I start the vnc server with a local port forwarding in the ssh session.

As soon as I used ssh sessions more frequently (mainly textual web browsing, script, programming and in general, things that didn't need a GUI), I noticed one thing: You cannot have multiple terminals.
I was used to the 6 virtual terminals (or tty) available in Debian to perform different tasks at the same time, but there's no such thing in ssh (unless you connect several times).
Some of you may argue that Unix terminals actually support background processes, so, if I need to continue using the prompt, I just need to suffix the commands I need with an "&" and I'm good to go.
Technically that's right, and I've done that actually, but I personally prefer to have more command prompts at my disposal.

I searched for a possible solution, and there it was, a program called GNU screen.
This program allows you to execute multiple terminal windows at the same time, therefore, allowing you to perform a sort of "multitasking" within any terminal session (ssh included).

In this post I will show you some of the operations you can perform with this program, please notice though that this won't be a full tutorial on it.
Please also notice that I will assume you're using Debian Wheezy, but, with slight modifications you should be able to do this with other distributions as well.

First of all let's install screen, on Debian you can do that by typing:

sudo apt-get install screen

A screen session is a standard session with additional key bindings that you can use to create new windows and switch between them.
You can even "detach" from a screen session, that is, you can quit it, but it keeps executing in background, so that you can "re-attach" to it later, and thanks to this mechanism you can have multiple screen sessions.
In my case, this is also useful if for some reason the ssh connection falls down, this way in fact, after reconnecting, I can resume what I was doing.

Because this is a command line program, keyboard shortcuts (inside the session) and arguments (at program startup) will be used to perform most of the operations and configure it. As default, the program assumes that all key bindings start with "CTRL-A".
Example:

CTRL-A c

This shortcut creates a new window and immediately switches to it.
Please notice that the further letters you will specify after the CTRL-A shortcut are case sensitive.
Other basic key bindings are:

  • CTRL-A DIGIT
    This shortcut makes you switch to window number DIGIT (where DIGIT is a digit from 0 to 9).
  • CTRL-A n
    This shortcut makes you switch to the next window.
  • CTRL-A p
    This shortcut makes you switch to the previous window.
  • CTRL-A '
    This shortcut opens a prompt where you can type the number or the name of a window, when you press Enter, you will switch to it.
  • CTRL-A "
    This shortcut shows a list of the available windows.
    If you press Enter on one of them, you will switch to it.
  • CTRL-A A
    This shortcut allows you to change the title of the window (perfect to discriminate upon the purpose of the window).
  • CTRL-A h
    This shortcut dumps the content of the terminal screen into a text file (the file will be saved as "hardcopy.N" where N is an increasing number).
  • CTRL-A i
    This shortcut shows information about the current window.
  • CTRL-A k
    This shortcut destroys the current window.
  • CTRL-A d
    This shortcut let you detach from the current screen session.
    The screen session is still executing in background, allowing you to re-attach to it.
  • CTRL-A \
    This shortcut closes the screen session.
  • CTRL-A ?
    This shortcut shows all the key bindings of screen.

In order to start screen you have to type:

screen

At the beginning of the session, you will have only one window, window 0.
To close the session press CTRL-A \.

Now that the basic key bindings are listed, I will propose to you some example situations, in order to explain some example usage and further commands.
Let's say you need to edit a file named "c.txt", but in order for you to do that, you need to know the content of the files "a.txt" and "b.txt".
Normally, you would need to open the three files this way:

nano a.txt &
nano b.txt &
nano c.txt &

and then use the fg command to see each content.
Personally, I think this may be frustrating.
With screen on the other hand, you create two further windows, then you switch between them in order to type one command per each window:

nano a.txt
nano b.txt
nano c.txt

Now, all you want to do, is again, to switch windows, in order to write the file "c.txt" correctly.

As already said before, screen has the interesting feature to allow multiple sessions.
Let's say you have some heavy tasks to perform (for example some heavy automated scripts), so you decide to execute them in a screen session, in different windows, but then, you create another window for other purposes.
What if you erroneously switch to one of the other windows and cause problems to the executing script (like its premature ending)?
With screen you better do something different: have two different sessions, one for yourself, and another for the heavy scripts.
Type the usual:

screen

To start a new session, now, start all the automated scripts you need.
At this point from any window press "CTRL-A d", to detach from the session.
Type again:

screen

To make a new session.
You're done, your heavy scripts are executing in background.
What if I need to go back to them? You may ask.
First detach, then type:

screen -ls

To show all the available sessions, check the information correlated to them and find the one you want to attach yourself to, then type:

screen -r INFO

where INFO can be all the information that you see in the output, or just the first part, that is, the process id of the screen session.

In reality, this program has far more capabilities, like the possibility to split the screen horizontally, to have multiple windows in the same screen, or the copy and paste function across windows.
In order to learn more about the program, please, check its manual by typing the usual:

man screen

I hope I got you curious about this utility, which can be very useful when working with terminal sessions.
Do you liked this post?
Do you have doubts or suggestions?
Please comment to let me know.
Greetings from Antonio Daniele.
See you next month.

Go back to the top, Share, Look at the comments or Comment yourself!

GNU screen: introduzione al "multitasking" nelle sessioni di terminale

Nel precedente post, ho spiegato come disabilitare il monitor interno del portatile in grub ed utilizzare al suo posto i monitor vga esterni.
Ho spiegato ciò perché è ciò che è successo a me: il monitor del mio portatile ha smesso di funzionare correttamente.

Sfortunatamente per me, non posso sempre collegarmi a monitor esterni.
Ovviamente, se posso, evito di utilizzare il computer in primo luogo, ma molte volte mi trovo costretto, e in questi casi utilizzo un'altra tecnica.

Quelli che seguono questo blog da (almeno) dicembre 2014 ricorderanno il video post sul Setup di base di VNC e SSH su Linux.
In quel post mi sono occupato di installare e configurare su Linux i due protocolli prima menzionati.

La "tecnica alternativa" consiste nell'utilizzo di un server ssh:
In pratica, ho impostato Debian affinché esegua all'avvio il server ssh e si connetta automaticamente alla lan senza fili.
Una volta che Debian è avviato, tutto quel che devo fare è collegarmi da un client (di solito il Galaxy Tab).
Se ho bisogno di un'interfaccia grafica, avvio il server vnc con un inoltro di porta locale nella sessione ssh.

Non appena ho iniziato ad usare le sessioni ssh più frequentemente (principalmente navigazione web testuale, script, programmazione e in generale, cose che non necessitano di un'interfaccia), ho notato una cosa: Non è possibile avere molteplici terminali.
Mi ero abituato ai 6 terminali virtuali (o tty) disponibili su Debian per effettuare diverse operazioni allo stesso tempo, ma non c'è niente del genere in ssh (a meno che non vi connettiate molte volte).
Alcuni potrebbero ribattere dicendo che i terminali Unix supportano i processi in background, quindi, se ho bisogno di continuare ad usare il prompt, devo eseguire i comandi di cui ho bisogno con il suffisso "&" e "sono a posto".
Tecnicamente è corretto, e a dire il vero, ho fatto anche questo, ma personalmente preferisco avere più prompt dei comandi a mia disposizione.

Ho cercato una possibile soluzione, ed eccola lì, un programma chiamato GNU screen.
Questo programma vi permette di eseguire molteplici finestre di terminale allo stesso tempo, quindi, vi permette una sorta di "multitasking" all'interno di una qualsiasi sessione di terminale (ssh incluso).

In questo post vi mostrerò come effettuare alcune delle operazioni, vi faccio notare però che questo non vuole essere un tutorial completo.
Vi faccio ulteriormente notare che assumerò che usiate Debian Wheezy, ma con un po' di differenze dovreste riuscire a fare queste cose anche su altre distribuzioni.

Prima di tutto installiamo screen, su Debian potete farlo digitando:

sudo apt-get install screen

Una sessione screen è una sessione comune con combinazioni di tasti aggiuntive utilizzabili per creare nuove finestre e spostarvi tra di esse.
Potete anche "staccarvi" da una sessione screen, ovvero, abbandonarla, ma essa continua ad essere in esecuzione in background, cosìcche possiate "riattaccarvi" ad essa più tardi, e grazie a questo meccanismo, potete avere molteplici sessioni di screen.
Nel mio caso, questo è anche utile se per una qualche ragione la sessione ssh cade, infatti, in questo modo, dopo essermi riconnesso, posso riprendere quel che facevo.

Poiché questo è un programma a riga di comando, le scorciatoie da tastiera (all'interno della sessione) e gli argomenti (all'avvio del programma) verranno utilizzati per effettuare la stragrande maggioranza delle operazioni e per configurarlo.
Il programma assume in maniera predefinita che tutte le combinazioni di tasti inizino con "CTRL-A".
Ad esempio:

CTRL-A c

Questa scorciatoia crea una nuova finestra e si sposta immediatamente su essa.
Vi prego di notare che le ulteriori lettere che specificherete dopo la scorciatoia CTRL-A sono sensibili alle maiuscole/minuscole.
Altre combinazioni di base sono:

  • CTRL-A CIFRA
    Questa scorciatoia vi fa spostare sulla finestra CIFRA (dove CIFRA è una cifra da 0 a 9).
  • CTRL-A n
    Questa scorciatoia vi fa spostare sulla finestra successiva.
  • CTRL-A p
    Questa scorciatoia vi fa spostare sulla finestra precedente.
  • CTRL-A '
    Questa scorciatoia apre un prompt dove è possibile digitare il numero o il nome di una finestra, quando premete Invio, vi sposterete su di essa.
  • CTRL-A "
    Questa scorciatoia mostra una lista delle finestre disponibili.
    Se premete Invio su una di esse, vi ci sposterete.
  • CTRL-A A
    Questa scorciatoia vi permette di cambiare il titolo della finestra (perfetto per discriminare in base allo scopo della finestra).
  • CTRL-A h
    Questa scorciatoia scarica il contenuto della schermata del terminale in un file di testo (il file verrà salvato come "hardcopy.N" dove N è un numero crescente).
  • CTRL-A i
    Questa scorciatoia mostra le informazioni sulla finestra corrente.
  • CTRL-A k
    Questra scorciatoia distrugge la finestra corrente.
  • CTRL-A d
    Questa scorciatoia vi permette di staccarvi dalla sessione screen corrente.
    La sessione screen rimane in esecuzione in background, permettendovi di riattaccarvi ad essa.
  • CTRL-A \
    Questa scorciatoia chiude la sessione screen.
  • CTRL-A ?
    Questa scorciatoia mostra tutte le combinazioni di tasti di screen.

Per avviare screen dovete digitare:

screen

All'inizio della sessione, avrete a disposizione una sola finestra, la finestra 0.
Per chiudere la sessione premete CTRL-A \.

Ora che le principali combinazioni di tasti sono elencate, vi proporrò alcune situazioni d'esempio, per potervi spiegare alcuni esempi d'utilizzo e ulteriori comandi.
Diciamo che avete bisogno di modificare un file chiamato "c.txt", ma per poterlo fare, dovete conoscere il contenuto dei file "a.txt" e "b.txt".
Normalmente, dovreste aprire i tre file in questo modo:

nano a.txt &
nano b.txt &
nano c.txt &

e poi usare il comando fg per vedere ogni contenuto.
Personalmente, penso che questo possa essere frustrante.
Con screen d'altro canto, vi basta creare due ulteriori finestre, poi vi spostate tra esse per digitare un comando a finestra:

nano a.txt
nano b.txt
nano c.txt

Ora, quel che dovete fare, è, di nuovo, spostarvi tra le finestre, per scrivere il file "c.txt".

Come già detto prima, screen ha la caratteristica interessante di permettere sessioni multiple.
Diciamo che avete alcuni compiti pesanti da eseguire (ad esempio alcuni pesanti script automatizzati), decidete dunque di eseguirli in una sessione screen, in diverse finestre, ma poi, create un'ulteriore finestra per altro scopo.
E se per sbaglio vi spostate su una delle altre finestre causando problemi allo script in esecuzione (tipo la fine prematura)?
Con screen conviene fare un'altra cosa: avere due sessioni diverse, una per voi, e l'altra per gil script pesanti.
Digitate il solito:

screen

Per iniziare una nuova sessione, ed avviate tutti gli script automatici di cui avete bisogno.
A questo punto, da una qualsiasi finestra premete "CTRL-A d", per staccarvi dalla sessione.
Digitate ancora:

screen

Per creare una nuova sessione.
Avete finito, i vostri script pesanti sono in esecuzione in background.
E se mi servisse tornare da loro? Vi chiederete.
Prima staccatevi, poi digitate:

screen -ls

Per mostrare tutte le sessioni disponibili, controllate le informazioni correlate ad esse e trovate quella a cui volete attaccarvi, poi digitate:

screen -r INFO

dove INFO possono essere tutte le informazioni che vedete nell'output, o solo la prima parte, cioè, l'id processo della sessione screen.

In realtà, questo programma ha molte più capacità, come la possibilità di dividere lo schermo orizzontalmente, per avere finestre multiple sulla stessa schermata, o la funzione copia e incolla tra le finestre.
Per imparare di più su tale programma, contrallatene il manuale digitando il solito:

man screen

Spero di avervi incuriosito su questo programma, che può essere molto utile quando si lavora con le sessioni di terminale.
Vi è piaciuto il post?
Avete dubbi o suggerimenti?
Vi prego, commentate e fatemi sapere.
Saluti da Antonio Daniele.
Ci si vede il mese prossimo.

Torna in cima, Condividi, Guarda i commenti o Commenta tu stesso!