GNU Screen
GNU Screen is a wrapper that allows separation between the text program and the shell from which it was launched. This allows the user to, for example, start a text program in a terminal in X, kill X, and continue to interact with the program.
Contents
- 1 Installation
- 2 Usage
-
3 Tips and tricks
- 3.1 Change the escape key
- 3.2 Start at window 1
- 3.3 Nested Screen Sessions
- 3.4 Use 256 colors
- 3.5 Informative statusbar
- 3.6 Turn welcome message off
- 3.7 Turn your hardstatus line into a dynamic urxvt|xterm|aterm window title
- 3.8 Use X scrolling mechanism
- 3.9 Attach an existing running program to screen
- 3.10 Setting a different bash prompt while in screen
- 3.11 Turn off visual bell
- 4 Troubleshooting
- 5 See also
Installation
GNU Screen can be installed using the screen package.
Usage
Commands are entered pressing the "escape key" Ctrl+a
and then the key binding.
Some users find the default escape key Ctrl+a
inconvenient. The escape key can be changed to another key as described below.
Common Commands
-
Ctrl+a
?
Displays commands and its defaults (VERY important) -
Ctrl+a
:
Enter to the command prompt of screen -
Ctrl+a
"
Window list -
Ctrl+a
0
opens window 0 -
Ctrl+a
A
Rename the current window -
Ctrl+a
a
SendsCtrl+a
to the current window -
Ctrl+a
c
Create a new window (with shell) -
Ctrl+a
S
Split current region into two regions -
Ctrl+a
tab
Switch the input focus to the next region -
Ctrl+a
Ctrl+a
Toggle between current and previous region -
Ctrl+a
Esc
Enter Copy Mode (use enter to select a range of text) -
Ctrl+a
]
Paste text -
Ctrl+a
Q
Close all regions but the current one -
Ctrl+a
X
Close the current region -
Ctrl+a
d
Detach from the current screen session, and leave it running. Usescreen -r
to resume
Command Prompt Commands
-
Ctrl+a
:quit
Closes all windows and closes screen session -
Ctrl+a
:source ~/.screenrc
Reloads screenrc configuration file (can alternatively use /etc/screenrc)
Named sessions
To create a named session, run screen with the following command:
$ screen -S session_name
To (re)name an existing a session, run the following command while screen is running:
Ctrl+a
:sessionname session_name
To print a list of pid.tty.host strings identifying your screen sessions:
$ screen -list
To attach to a named screen session, run this command:
$ screen -x session_name
or
$ screen -r session_name
Autostart with systemd
This service autostarts screen for the specified user (e.g. systemctl enable screen@florian
). Running this as a system unit is important, because systemd --user instance is not guaranteed to be running and will be killed when the last session for given user is closed.
/etc/systemd/system/screen@.service
[Unit] Description=screen After=network.target [Service] Type=simple User=%i ExecStart=/usr/bin/screen -DmS autoscreen ExecStop=/usr/bin/screen -S autoscreen -X quit [Install] WantedBy=multi-user.target
Tips and tricks
Change the escape key
It can be a good idea to change the default escape key, not only because "a" is usually typed with the left pinky, but also because Ctrl+a
is mapped to the common command beginning-of-line
in GNU Readline and Bash-like shells.
The escape key can be changed with the escape
option in ~/.screenrc
, or the -e
option to screen
.
For example, if you find that you rarely type Ctrl+j
in your shell or editor, you could use escape ^Jj
to set the escape key to Ctrl+j
. The second "j" means that a literal Ctrl+j
can be sent to the terminal via the sequence Ctrl+j j
. For Dvorak keyboard users, Ctrl+t
(escape ^Tt
) might be more convenient.
More exotic options include escape ``
which sets the escape key to `
, or escape ^^^
which sets it to Ctrl+^
.
The escape key is also called the "command character" in Screen documentation.
Start at window 1
By default, the first screen window is 0. If you'd rather never have a window 0 and start instead with 1, add the following lines on your configuration:
~/.screenrc
bind c screen 1 bind ^c screen 1 bind 0 select 10 screen 1
Nested Screen Sessions
It is possible to get stuck in a nested screen session. A common scenario: you start an ssh session from within a screen session. Within the ssh session, you start screen. By default, the outer screen session that was launched first responds to Ctrl+a
commands. To send a command to the inner screen session, use Ctrl+a
a
, followed by your command. For example:
-
Ctrl+a
a
d
Detaches the inner screen session. -
Ctrl+a
a
K
Kills the inner screen session.
Use 256 colors
By default, screen uses an 8-color terminal emulator. To enable more colors, you need to be using a terminal that supports them and set the correct term value. This will use terminfo to describe how the ANSI escape codes will be interpreted. An entry in the terminfo database structure must exist, ncurses provides many common descriptions stored under /usr/share/terminfo/
.
First try the generic value:
~/.screenrc
term screen-256color
If that does not work, try setting it based on the used terminal. When using xterm-based terminal:
~/.screenrc
term xterm-256color
When using rxvt-unicode:
~/.screenrc
term rxvt-unicode-256color
As a last resort, try setting termcapinfo instead:
~/.screenrc
attrcolor b ".I" # allow bold colors - necessary for some reason termcapinfo xterm 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm' # tell screen how to set colors. AB = background, AF=foreground defbce on # use current bg color for erased chars
Informative statusbar
The default statusbar may be a little lacking. You may find this one more helpful:
~/.screenrc
hardstatus off hardstatus alwayslastline hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %m-%d %{W} %c %{g}]'
Another possibility, taken from frodfrog's blog is:
~/.screenrc
hardstatus alwayslastline '%{= G}[ %{G}%H %{g}][%= %{= w}%?%-Lw%?%{= R}%n*%f %t%?%{= R}(%u)%?%{= w}%+Lw%?%= %{= g}][ %{y}Load: %l %{g}][%{B}%Y-%m-%d %{W}%c:%s %{g}]'
Turn welcome message off
~/.screenrc
startup_message off
Turn your hardstatus line into a dynamic urxvt|xterm|aterm window title
This one is pretty simple; just switch your current hardstatus
line into a caption
line with notification, and edit accordingly:
~/.screenrc
backtick 1 5 5 true termcapinfo rxvt* 'hs:ts=\E]2;:fs=\007:ds=\E]2;\007' hardstatus string "screen (%n: %t)" caption string "%{= kw}%Y-%m-%d;%c %{= kw}%-Lw%{= kG}%{+b}[%n %t]%{-b}%{= kw}%+Lw%1`" caption always
This will give you something like screen (0 bash)
in the title of your terminal emulator. The caption supplies the date, current time, and colorizes your screen window collection.
Use X scrolling mechanism
The scroll buffer of GNU Screen can be accessed with Ctrl+a
[
. However, this is very inconvenient. To use the scroll bar of e.g. xterm or konsole, add the following line:
~/.screenrc
termcapinfo xterm* ti@:te@
Attach an existing running program to screen
If you started a program outside screen, but now you would like it to be inside, you can use reptyr to reparent the process from it's current tty to one inside screen.
Get the PID of the process (you can use ps ax
for that). Now just enter the PID as argument to reptyr inside a screen window.
$ reptyr <pid>
Setting a different bash prompt while in screen
If you want a different bash prompt when in a screen session, add the following to your .bashrc:
if [ -z $STY ] then PS1="YOUR REGULAR PROMPT" else PS1="YOUR SCREEN PROMPT" fi
Turn off visual bell
With this setting, screen will not make an ugly screen flash instead of a bell sound.
~/.screenrc
vbell off
Troubleshooting
Fix for residual editor text
When you open a text editor like nano in screen and then close it, the text may stay visible in your terminal. To fix this, put the following:
~/.screenrc
altscreen on
Fix for Name column in windowlist only show "bash"
add following to ~/.screenrc
~/.screenrc
windowlist string "%4n %h%=%f"
See also
- MacOSX Hints - Automatically using screen in your shell
- Gentoo Wiki - Tutorial for screen
- Arch Forums - Regarding 256 color issue with urxvt
- Arch Forums - .screenrc configs with screenshots
- Ratpoison - A window manager based on gnu screen
- Xpra - An utility to detach/reattach X programs, in a way similar as screen does for command line based programs