Screen? A must for SSH

If you've ever used SSH to connect to a server, you 'll know its limitations: if you want to open a new window, you'll need to create a second SSH connection to the server. And if the connection breaks during the SSH tunnel, you've lost your progress. This is where Screen comes in.

Screen, which calls itself a "full-screen window manager that multiplexes a physical terminal between several processes (typically interactive shells)." is a usefull tool to use 1 SSH connection, but use multiple screens to work in. So you can have 1 screen to write some scripts in, another to tail a logfile and a third to check your IRC messages ;-)

Screen is installed by default on most installations, you can verify this by running the "which screen" command. If it's not installed, try to apt-get or yum it -- it's in most repositories.

You can start screen by typing:

# screen

This makes sense, right? :-)
You'll probably notice that not much happens if you type that. At least, it seems like not much as happened. In fact, you've just opened a new "screen" to type your commands. The program "screen" has a few commands of its own, in order to create a new window, and navigate through the open ones.

Once you've opened "screen", you can see a command list by typing CTRL + A, followed by "?" (the question mark). By typing CTRL + A you state that the next signal is to be sent to the program "screen", in stead of to the Shell (like you would in a normal shell). You'll see a list of all bindings known to "screen".

Start a new window by typing CTRL + A + "c". The C stands for Create -- I know, too obvious. A new window will be created. In order to test this, type the command "top". Then create a new window, by using CTRL + A + "c". You'll see top disappear, and a new window will open. Type in some commands of your choice, and return to the previous window, by doing CTRL + A + "n". The "n" stands for "Next", and will open the next screen. CTRL + A + "p" would've opened the previous screen.

Closing a window, can be done by typing "exit" (like you would in a normal shell). This will cause you to fall back to the previous monitor you opened, or to your main prompt -- where you started screen, showing you a message such as "[screen is terminating]" -- so you'll know you've hit the main shell.

The biggest advantage in using screen, is that you can "detach" a screen-session. This means you return to the normal shell, but the processes started in "screen" are still active in the background. You can detach yourself by typing CTRL + A + "d". Again, obvious that "D" stands for Detach. This gives you more flexibility for managing your server(s): you can start a number of processes, quietly exit the shell and return a couple of hours later to pick up the session started in screen.

Should you disconnect by accident, during a screen-session, you can always pick up a previous (detached!) screen by relogging to the shell and typing:

# screen -ls
There are screens on:
27111.screen_untarring  (Detached)
27097.screen_disking    (Detached)
2 Sockets in /var/run/screen/S-root.

This will show a list of all running screen-sessions at any given time. You can pick up a previous screen-session, by typing

# screen -r <name_of_session>

Given the "screen -ls" output from above, you can restore your screen session by typing:

# screen -r 27111.screen_untarring

It's enough to type in the first unique characters of the screen name, it'll automatically find the session you want. So in essence, "screen -r 271" would have been enough.

If you see in your list of screens that one session is still attached, you can not resume it before you detach it.

# screen -ls
There is a screen on:
27097.screen_disking    (Attached)
1 Socket in /var/run/screen/S-root.

# screen -d 270
[27097.screen_disking detached.]

# screen -r 270

You can also expand your "screen experience", by modifying the config-file to create a screen similar to the one shown below. (thanks to the comments)



You can get the extra "statusbar" at the bottom, by creating a file "~/.screenrc" and adding the following lines to it.

hardstatus alwayslastline
hardstatus string '%{= kG}[ %{G}%H %{g}][ %{=kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B}%Y-%m-%d %{W}%c %{g}]'
defscrollback 1000
startup_message off

This will keep your current hostname, screen windows open & date-time at the bottom of each started screen. More screen tips can be found here: Screen power tips.

Probably known to most linux-administrators, but still an awesome tool :-)

The Social Box

You can sign up for more updates via Twitter or Facebook below. On Twitter, I regularly talk about technology or tweet about interesting stories. Topics that don't necessarily make it to this blog. Facebook contains a steady update of blogposts and some more lightweight stories.

The @mattiasrss account has an automated RSS feed of all blogposts that get published.

Write a Comment

Do you care about the markup if your comment? You can use the following HTML tags:

<code>command</code>: command highlighting
<pre>text</pre>: pre-formatted code, can be multi-line (black background, white letters)

example <pre> tag
<blockquote>text</blockquote> quoted text
quoted example

None of this is needed of course, it's all optional!




  1. Unfortunately it’s not possible to exit screen by pressing CRTL+D after previously having pressed CTRL+S… Can anyone confirm this? Using Debian Etch 4.0.

  2. If you accidently leave your screen attached and you want to connect to it, you can use “screen -d nameofsession” (sans quotes of course) to detach it, and then attach it on the computer you’re on.

  3. Making your own .screenrc file in your home directory can be very nice as well. This is what I use and it really helps manage screen better:

    hardstatus alwayslastline
    hardstatus string ‘%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f %t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %d/%m %{W}%c %{g}]’

  4. The man page is pretty informative. -S gives the session a name (easier to resume). Even easier is using “-d -R”, which creates or resumes a session with a given name.

    screen -d -R WorkSession

  5. If you use emacs-style command line editing, CTRL-A (go to the beginning of line) is a bad command key. Add the following to your ~/.screenrc to change it to CTRL-O (the letter o):

    escape “^Oo”

    It’s also great to reduce many xterms to a single one!

  6. thanks for the tutorial! is that supposed to be a regular single quote (‘) at the end of the hardstatus string in the ~.screenrc file?
    i had to change it to make it work.