ArchWiki / GNU Screen
ArchWiki / GNU Screen
de:Screen hu:GNU Screen ja:GNU Screen ru:GNU Screen zh-hans:GNU Screen
GNU Screen is a full-screen window manager that multiplexes a physical terminal between several processes, typically interactive shells. Programs running in Screen continue to run when their window is currently not visible and even when the whole screen session is detached from the user's terminal.
See the official overview GNU Screen manual for the description of the features.
Installation
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 in #Change the escape key.
Common Commands
Ctrl+a?Displays commands and their defaultsCtrl+a:Enter to the command prompt of screenCtrl+a"Window listCtrl+a0opens window 0Ctrl+aARename the current windowCtrl+aaSendsCtrl+ato the current windowCtrl+acCreate a new window (with shell)Ctrl+aSSplit current region horizontally into two regionsCtrl+a|Split current region vertically into two regionsCtrl+atabSwitch the input focus to the next regionCtrl+aCtrl+aToggle between current and previous regionCtrl+aEscEnter Copy Mode (use enter to select a range of text)Ctrl+a]Paste textCtrl+aQClose all regions but the current oneCtrl+aXClose the current regionCtrl+adDetach from the current screen session, and leave it running. Usescreen -rto resume
Command Prompt Commands
Ctrl+a:quitCloses all windows and closes screen sessionCtrl+a:source ~/.screenrcReloads screenrc configuration file (can alternatively use/etc/screenrc)
Named sessions
To create a named session, run screen with the following command:
$ screen -S session_nameTo (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 -listTo attach to a named screen session, run this command:
$ screen -x session_nameor
$ screen -r session_nameCustomizing Screen
You can modify the default settings for Screen according to your preference either through a personal .screenrc file which contains commands to be executed at startup (e.g. ~/.screenrc) or on the fly in command mode (e.g. Ctrl+a :vbell off).
Tips and tricks
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 the user is closed.
[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
/etc/systemd/system/screen@.serviceChange 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 would rather never have a window 0 and start instead with 1, add the following lines on your configuration:
bind c screen 1
bind ^c screen 1
bind 0 select 10
screen 1~/.screenrcNested 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+aadDetaches the inner screen session.Ctrl+aaKKills the inner screen session.
Start Screen on every shell
For Bash and Zsh, add the following snippet to your .bashrc or .zshrc before your aliases:
if [[ -z "$STY" ]]; then
screen -xRR session_name
fi
~/.bashrc or ~/.zshrcUse 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:
term screen-256color~/.screenrcIf that does not work, try setting it based on your terminal. When using xterm-based terminal:
term xterm-256color~/.screenrcWhen using rxvt-unicode:
term rxvt-unicode-256color~/.screenrc/usr/share/terminfo/r/rxvt-unicode-256color is provided by rxvt-unicode-terminfo, which is installed as a dependency of rxvt-unicode. However, if you log into a server via SSH and run screen there, this terminfo file might not be available on the server. In this case it is recommended to copy /usr/share/terminfo/r/rxvt-unicode-256color on the server, it can be saved in ~/.terminfo/.
As a last resort, try setting termcapinfo instead:
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
~/.screenrcInformative statusbar
The default statusbar may be a little lacking. You may find this one more helpful:
truecolor on
hardstatus off
hardstatus alwayslastline '%{#00ff00}[ %H ][%{#ffffff}%= %{7}%?%-Lw%?%{1;0}%{1}(%{15}%n%f%t%?(%u)%?%{1;0}%{1})%{7}%?%+Lw%? %=%{#00ff00}][ %{#00a5ff}%{6}%Y-%m-%d %{#ffffff}%{7}%0c%{#00ff00} ]'
~/.screenrcstatusbar at top:
hardstatus firstline
~/.screenrcTurn welcome message off
startup_message off~/.screenrcTurn 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:
termcapinfo rxvt* 'hs:ts=\E]2;:fs=\007:ds=\E]2;\007'
hardstatus string "screen (%n: %t)"
caption always '%{= 7;0}%Y-%m-%d %c %-Lw%{+b 2;0}[%n %t]%{-}%+Lw%=%{-}'
~/.screenrcThis 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 https://unix.stackexchange.com/a/505703:
termcapinfo xterm*rxvt*kterm*Eterm* ti@:te@~/.screenrcAttach 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 its 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 pidSetting a different bash prompt while in screen
If you want a different bash prompt when in a screen session, add the following to your .bashrchttps://serverfault.com/questions/257975/how-to-check-if-im-in-screen-session:
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.
vbell off~/.screenrcGetting rid of the vertical and horizontal bars
To get rid of the vertical bars:
rendition so =00$ ~/.screenrcTo hide the horizontal bar, set the back and foreground color to default (d) and display a blank (" "):
caption string "%{03} "~/.screenrcIf this does not work, try caption string "%{00} " instead. For the default caption in black and white, use caption string "%{00}%3n %t".
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:
altscreen on~/.screenrcFix for Name column in windowlist only show "bash"
Add following to ~/.screenrc:
windowlist string "%4n %h%=%f"~/.screenrc