Screen? A must for SSH

Oh Dear! monitors your entire site, not just the homepage. We crawl and search for broken pages and mixed content, send alerts when your site is down and notify you on expiring SSL certificates.

Start your free 10 day trial! »

Image of Mattias Geniar

Mattias Geniar, June 04, 2008

Follow me on Twitter as @mattiasgeniar

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 :-)

Want to subscribe to the cron.weekly newsletter?

I write a weekly-ish newsletter on Linux, open source & webdevelopment called cron.weekly.

It features the latest news, guides & tutorials and new open source projects. You can sign up via email below.

No spam. Just some good, practical Linux & open source content.