Screen
GNU Screen
According to the GNU screen web page, screen
is //...a full-screen window manager that multiplexes a physical terminal between several processes, typically interactive shells. // What that means is: it lets users multitask within a single console window. It provides a feature similar to the Windows Task Manager, but it has even more benefits.
Using Screen
Connecting
It couldn't be much simpler to start screen
...just run the command at a console prompt.
bash-3.00# screen
At this point, my terminal is cleared and my cursor moves to the first line[^1]. The title bar in my SSH application changes too--it normally shows the hostname I'm connected to, but now it says "screen" instead.
I'll start a top
session. This will occupy my console until I press <ctrl>-c.
top - 16:32:06 up 60 days, 21 min, 1 user, load average: 2.00, 2.00, 2.00
Tasks: 102 total, 2 running, 100 sleeping, 0 stopped, 0 zombie
Cpu(s): 15.4% us, 26.2% sy, 0.0% ni, 56.4% id, 0.3% wa, 1.4% hi, 0.3% si
Mem: 4914404k total, 4870756k used, 43648k free, 346636k buffers
Swap: 8289532k total, 0k used, 8289532k free, 3751860k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7538 root 20 0 197m 9900 5024 S 101.3 0.2 61150:27 asterisk
28858 oracle 25 0 849m 26m 24m R 99.3 0.6 21010:20 oracle
1 root 16 0 4772 516 428 S 0.0 0.0 0:04.75 init
2 root RT 0 0 0 0 S 0.0 0.0 0:02.10 migration/0
3 root 34 19 0 0 0 S 0.0 0.0 0:00.09 ksoftirqd/0
4 root RT 0 0 0 0 S 0.0 0.0 0:02.79 migration/1
5 root 34 19 0 0 0 S 0.0 0.0 0:00.23 ksoftirqd/1
6 root RT 0 0 0 0 S 0.0 0.0 0:01.22 migration/2
7 root 34 19 0 0 0 S 0.0 0.0 0:00.05 ksoftirqd/2
8 root RT 0 0 0 0 S 0.0 0.0 0:00.98 migration/3
9 root 34 19 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd/3
Normally I would need to start a second ssh connection to interact with the machine while top is running, but here's where the magic of screen
begins.
Creating a New Console
Use <ctrl>-a c
key combination (press and hold <ctrl>
while pressing a
, then release both and press c
). This will create a new virtual console and place it in front of the previous screen. It will appear to be a new console with a shell prompt.
bash-3.00#
The only visible difference is that the terminal title will change if your terminal setting allow it. My title changed to "[screen 1: bash]
". Now I can perform any tasks I need to as if the other console didn't exist. I can create up to 9 virtual consoles this way.
Switching Consoles
Having more than one virtual console is great, but you'll need to switch between them. That's easy:
<ctrl>-a 0
thru<ctrl>-a 9
brings console 0 thru 9 to the front, respectively<ctrl>-a n
brings the 'next' console to the front<ctrl>-a p
brings the 'previous' console to the front<ctrl>-a "
displays a list of all consoles and select one using up/down/enter keys
This is a huge bonus for those of us who write software because we can (for example):
- write code in one console
- make changes to configuration files in another console
- tail a log in another console
- leave another console open for various admin commands
- connect to another machine with ssh in another console
- etc.
In other words, it helps to minimize the distractions and wasted time caused by changing directories, getting in/out of various programs like tail and top, etc.
Disconnecting and Reconnecting
Even better...a screen
session remains in memory until you exit all of its consoles manually. Suppose I lost connectivity to one of my machines [^2]. Under normal circumstances, I would lose every window that I had open on the machine in question. But thanks to screen
, that changes.
Every virtual console is stored inside my screen "session", and that session stays in memory even if my connection is broken. So I can login again and find/reconnect to my session like this:
login as: xxxxxx
xxxxxx@mymachine's password:
Last login: Tue Jul 28 17:11:24 2009 from yyyyyyyy
-bash-3.00# screen -ls
There is a screen on:
19645.pts-0.mymachine (Detached)
Aha...my screen session is named 19645.pts-0.mymachine
. So I'll reconnect to it.
bash-3.00# screen -r 19645.pts-0.mymachine
And I'm back right where I was before my VPN flaked out. No lost productivity. No need to reestablish all the SSH connections that were up and running. My connectivity and processes are all right where I left them.
screen
even gives me a way to disconnect from my running active session: <ctrl>-a d
. I'll do this if I want to connect to another machine and run screen
over there (because otherwise my <ctrl>-a
keystrokes will be interpreted on my current machine).
Advanced Stuff
Renaming Consoles
You can navigate to any console and hit <ctrl>-a A
(note the capital A) and you will be allowed to enter a meaningful title for the window. This is useful when you have two of the same processes running and the process name doesn't tell you what the console's purpose is. When pressing the above key combination, the last line of the current terminal will display the following:
Set window's title to:
and you should enter a meaningful name and press enter. Below is an example with three consoles that have been given meaningful names:
Num Name Flags
0 Tail Window $
1 Log Window $
2 Interactive Window $
[^1] this behavior might depend on your terminal settings
[^2] due to a flaky wifi or VPN connection...don't get me started!