Introduction
Screen is a console application that allows you to use multiple terminal sessions within one window. The program operates within a shell session and acts as a container and manager for other terminal sessions, similar to how a window manager manages windows.
There are many situations where creating several terminal windows is not possible or ideal. You might need to manage multiple console sessions without an X server running, you might need to access many remote cloud servers, or you might need to monitor a running program’s output while working on some other task.
There are modern, all-in-one solutions to this problem, like tmux, but screen
is the most mature of them all, and it has its own powerful syntax and features.
Step 1 – Installing Screen
In this tutorial, we’ll be using Ubuntu 22.04, but outside of the installation process, everything should be the same on every modern Linux distribution.
Screen is often installed by default on Ubuntu. You can also use apt
to update your package sources and install screen
:
sudo apt update
sudo apt install screen
Verify that screen
has been installed by running which screen
:
which screen
/usr/bin/screen
You can begin using screen
in the next step.
Step 2 – Using Screen
To start a new screen session, run the screen
command.
screen
[secondary_label Output
GNU Screen version 4.09.00 (GNU) 30-Jan-22
Copyright (c) 2018-2020 Alexander Naumov, Amadeusz Slawinski
Copyright (c) 2015-2017 Juergen Weigert, Alexander Naumov, Amadeusz Slawinski
Copyright (c) 2010-2014 Juergen Weigert, Sadrul Habib Chowdhury
Copyright (c) 2008-2009 Juergen Weigert, Michael Schroeder, Micah Cowan, Sadrul Habib
Chowdhury
Copyright (c) 1993-2007 Juergen Weigert, Michael Schroeder
Copyright (c) 1987 Oliver Laumann
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; either version 2, or (at your option) any later version.
…
[Press Space for next page; Return to end.]
You’ll be greeted with the licensing page upon starting the program. Just press Enter to continue.
What happens next may be surprising. We are given a normal command prompt and it looks like nothing has happened. Did screen
fail to run correctly? Let’s try a quick keyboard shortcut to find out. Press Ctrl+a
, followed by v
:
screen 4.09.00 (GNU) 30-Jan-22
We’ve just requested the version information from screen, and we’ve received some feedback that allows us to verify that screen is running correctly.
Now is a great time to introduce the way that we will be controlling screen
. Screen is mainly controlled through keyboard shortcuts. Every keyboard shortcut for screen
is prefaced with Ctrl-a
(hold the control key while pressing the “a” key). That sequence of keystrokes tells screen
that it needs to pay attention to the next keys we press.
You’ve already used this paradigm once when we requested the version information about screen
. Let’s use it to get some more useful information, by entering Ctrl-a ?
:
Screen key bindings, page 1 of 2.
Command key: ^A Literal ^A: a
break ^B b license , removebuf =
clear C lockscreen ^X x reset Z
colon : log H screen ^C c
copy ^[ [ login L select '
detach ^D d meta a silence _
digraph ^V monitor M split S
displays * next ^@ ^N sp n suspend ^Z z
dumptermcap . number N time ^T t
fit F only Q title A
flow ^F f other ^A vbell ^G
focus ^I pow_break B version v
hardcopy h pow_detach D width W
help ? prev ^H ^P p ^? windows ^W w
history { } quit wrap ^R r
info i readbuf < writebuf >
kill K k redisplay ^L l xoff ^S s
lastmsg ^M m remove X xon ^Q q
[Press Space for next page; Return to end.]
This is the internal keyboard shortcut screen. You’ll probably want to memorize how to get here, because it’s an excellent quick reference. As you can see at the bottom, you can press Space to get more commands.
Okay, let’s try something more fun. Let’s run a program called top
in this window, which will show us some information on our processes.
top
top - 16:08:07 up 1:44, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 58 total, 1 running, 57 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 507620k total, 262920k used, 244700k free, 8720k buffers
Swap: 0k total, 0k used, 0k free, 224584k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 3384 1836 1288 S 0.0 0.4 0:00.70 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.11 ksoftirqd/0
5 root 20 0 0 0 0 S 0.0 0.0 0:00.12 kworker/u:0
6 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
7 root RT 0 0 0 0 S 0.0 0.0 0:00.07 watchdog/0
8 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 cpuset
9 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 khelper
10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
11 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
12 root 20 0 0 0 0 S 0.0 0.0 0:00.03 sync_supers
13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 bdi-default
14 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kintegrityd
15 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kblockd
16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 ata_sff
17 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khubd
18 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 md
Okay, we are now monitoring the processes on our VPS. But what if we need to run some commands to find out more information about the programs we see? We don’t need to exit out of “top”. We can create a new window to run these commands.
The Ctrl-a c
sequence creates a new window for us. We can now run whatever commands we want without disrupting the monitoring we were doing in the other window.
Where did that other window go? We can get back to it using Ctrl-a n
.
This sequence goes to the next window that we are running. The list of windows wrap, so when there aren’t any windows beyond the current one, it switches us back to the first window.
Ctrl-a p
changes the current window in the opposite direction. So if you have three windows and are currently on the third, this command will switch you to the second window.
A helpful shortcut to use when you’re flipping between the same two windows is Ctrl-a Ctrl-a
.
This sequence moves you to your most recently visited window. So in the previous example, this would move you back to your third window.
At this point, you might be wondering how you can keep track of all of the windows that we are creating. Thankfully, screen comes with a number of different ways of managing your different sessions. First, we’ll create three new windows for a total of four windows and then we’ll try out Ctrl-a w
, one of Screen’s window management tools. Enter Ctrl-a c Ctrl-a c Ctrl-a c Ctrl-a w
:
0$ bash 1$ bash 2-$ bash 3*$ bash
We get some useful information from this command: a list of our current windows. Here, we have four windows. Each window has a number and the windows are numbered starting at “0”. The current window has an asterisk next to the number.
So you can see that we’re currently at window #3 (actually the fourth window because the first window is 0). You can get back to window #1 quickly by using Ctrl-a 1
.
We can use the index number to jump straight to the window we want. Let’s see our window list again using Ctrl-a w
:
0$ bash 1*$ bash 2$ bash 3-$ bash
As you can see, the asterisk tells us that we’re now on window #1. Let’s try a different way of switching windows with Ctrl-a “
:
Num Name Flags
0 bash $
1 bash $
2 bash $
3 bash $
We get an actual navigation menu this time. You can navigate with either the up and down arrows. Switch to a window by pressing Enter.
This is pretty useful, but right now all of our windows are named “bash”. That’s not very helpful. Let’s name some of our sessions. Switch to a window you want to name, for example with Ctrl-a 0
and then use Ctrl-a A
:
Set window's title to: bash
Using the Ctrl-a A
sequence, we can name our sessions. You can now backspace over “bash” and then rename it whatever you’d like. We’re going to run top
on window #0 again, so we’re going to name it monitoring
.
Verify the result with Ctrl-a “
:
Num Name Flags
0 monitoring $
1 bash $
2 bash $
3 bash $
Now we have a more helpful label for window #0. So we know how to create and name windows, but how do we get rid of them when we don’t need them anymore? We use the Ctrl-a k
sequence, which stands for “kill”.
Really kill this window [y/n]
Step 3 – Managing Screen Sessions
When you want to quit screen
and kill all of your windows, you can use Ctrl-a
.
Really quit and kill all your windows [y/n]
This will destroy our screen session. We will lose any windows we have created and any unfinished work.
But we want to explore one of the huge benefits of using “screen”. We don’t want to destroy the session, we want to detach it. Detaching allows our programs in the screen instance to continue to run, but it gives us access back to our base-console session (the one where we started “screen” from initially). The screen session is still there, it will just be managed in the background. Use Ctrl-a d
to detach.
[detached from 1835.pts-0.Blank]
So our session is now detached. How do we get back into it?
screen –r
The -r
flag stands for reattach. We are now back in our screen session. What if we have multiple screen sessions though? What if we had started a screen session and detached it, and then started a new screen session and detached that as well?
Try running screen
, then detaching with Ctrl-a d
, then running screen
again, then detaching with Ctrl-a d
again.
How do we tell screen
which session to attach?
screen –ls
There are screens on:
2171.pts-0.Blank (07/01/2013 05:00:39 PM) (Detached)
1835.pts-0.Blank (07/01/2013 03:50:43 PM) (Detached)
2 Sockets in /var/run/screen/S-justin.
Now we have a list of our sessions. We can reattach the second one by typing its id number after the -r
flag.
screen –r 1835
What if you want to attach a session on two separate computers or terminal windows? You can use the -x
flag, which lets you share the session.
screen –x
Step 4 – Managing Terminals Within Screen
There are a number of commands that help you manage the terminal sessions you run within screen
.
To copy text, you can use Ctrl-a [
.
This will give you a cursor that you can move with the arrow keys or with HJKL. Move to where you want to start copying, and press Enter. Move to the end of where you’d like to copy and press Enter again. The text is then copied to your clipboard.
One thing to be aware of is that this is also Screen’s mechanism for scrolling. If you need to see some text that is off the screen, you can hit Ctrl-a [
and then scroll up off of the screen.
We can paste text that we copied with Ctrl-a ]
.
Another thing you might want to do is monitor programs that are executing in another screen window.
Let’s say that you’re compiling something in one window and you want to know when it’s completed. You can ask screen
to monitor that window for silence with Ctrl-a _
, which will tell you when no output has been generated for 30 seconds.
Let’s try it with another example. Let’s have screen
tell us when our window is finished pinging Google 4 times.
ping –c 4 www.google.com
Then input Ctrl-a _
:
The window is now being monitored for 30 sec. Silence.
Now we can do work in another window and be alerted when the task in this window is complete by entering Ctrl-a 1
:
Window 2: silence for 30 seconds
We can also do the opposite and be alerted when there is activity happening on a specific window.
sleep 20 && echo “output”
Then, enter Ctrl-a M
.
Window 2 (bash) is now being monitored for all activity.
We will now be alerted when the command produces output. To see results, use Ctrl-a 1
:
Activity in window 2
Let’s say we are going to be doing some important changes and we want to have a log of all of the commands we run. We can log the session with Ctrl-a H
.
Creating logfile "screenlog.1".
Screen Regions
If we need to see multiple windows at once, we can use something that screen calls “regions”. We create more regions by splitting the current region. To split the current region horizontally, we can use Ctrl-a S
.
This will move our current window to the top half of the screen and open a new blank region below it. We can get to the lower screen with Ctrl-a [tab]
.
We can then either create a new window in the bottom region or change the view to a different window in the normal way.
If we want to kill the current region, we can use Ctrl-a X
.
That destroys the region without destroying the actual window. This means that if you were running a program in that region, you can still access it as a normal window, the view into that window was destroyed.
If we want to make a vertical split, we can use Ctrl-a |
instead.
The controls for vertical splits are the same as horizontal splits. If we’ve added a few different regions and want to go back to a single region, we can use Ctrl-a Q
, which destroys all regions but the current one.
Step 5 – Using Byobu with Screen
A great enhancement for screen
is a program called byobu
. It acts as a wrapper for screen
and provides an enhanced user experience. On Ubuntu, you can install it with:
sudo apt install byobu
Before we begin, we need to tell byobu
to use screen
as a backend. We can do this with the following command:
byobu-select-backend
Select the byobu backend:
1. tmux
2. screen
Choose 1-2 [1]:
We can choose screen
here to set it as the default terminal manager.
Now, instead of typing screen
to start a session, you can type byobu
.
byobu
When you type Ctrl-a
for the first time, you’ll have to tell byobu to recognize that as a screen command.
Configure Byobu's ctrl-a behavior...
When you press ctrl-a in Byobu, do you want it to operate in:
(1) Screen mode (GNU Screen's default escape sequence)
(2) Emacs mode (go to beginning of line)
Note that:
- F12 also operates as an escape in Byobu
- You can press F9 and choose your escape character
- You can run 'byobu-ctrl-a' at any time to change your selection
Select [1 or 2]:
Select 1
to use byobu as normal.
The interface gives you a lot of useful information, such as a window list and system information. On Ubuntu, it even tells you how many packages have security updates with a number followed by an exclamation point on a red background.
One thing that is different between using byobu and screen is the way that byobu actually manages sessions. If you run byobu
again once you’re detached, it will reattach your previous session instead of creating a new one.
To create a new session, use byobu –S
:
byobu –S sessionname
Change sessionname
to whatever you’d like to call your new session. You can see a list of current sessions with:
byobu –ls
There are screens on:
22961.new (07/01/2013 06:42:52 PM) (Detached)
22281.byobu (07/01/2013 06:37:18 PM) (Detached)
2 Sockets in /var/run/screen/S-root.
And if there are multiple sessions, when you run byobu
, you will be presented with a menu to choose which session you want to connect to.
byobu
Byobu sessions...
1. screen: 22961.new (07/01/2013 06:42:52 PM) (Detached)
2. screen: 22281.byobu (07/01/2013 06:37:18 PM) (Detached)
3. Create a new Byobu session (screen)
4. Run a shell without Byobu (/bin/bash)
Choose 1-4 [1]:
You can select any of the current sessions, create a new byobu session, or even get a new shell without using byobu.
One option that might be useful on a cloud server you manage remotely is to have byobu start up automatically whenever you log into your session. That means that if you are ever disconnected from your session, your work won’t be lost, and you can reconnect to get right back to where you were before.
To enable byobu to automatically start with every login, type this into the terminal:
byobu-enable
The Byobu window manager will be launched automatically at each text login.
To disable this behavior later, just run:
byobu-disable
Press <enter> to continue…
As it says, if you ever want to turn this feature off again, type:
byobu-disable
It will no longer start automatically.
Conclusion
In this tutorial, you installed and used screen
and then byobu
to manage terminal sessions. You learned several different shortcuts for detaching and switching between multiple running environments on the fly. Like many mature Unix terminal interfaces, Screen can be idiosyncratic, but it is also powerful and ubiquitous – you never know when it may come in handy.