Appearance
Screen Cheatsheet
Overview
GNU Screen is a terminal multiplexer that allows you to run multiple terminal sessions within a single terminal window. It enables session persistence, detachment, and reattachment, making it ideal for remote work and long-running processes.
Installation
Package Managers
bash
# Ubuntu/Debian
sudo apt install screen
# macOS
brew install screen
# CentOS/RHEL
sudo yum install screen
# Arch Linux
sudo pacman -S screen
# From source
wget https://ftp.gnu.org/gnu/screen/screen-4.9.0.tar.gz
tar -xzf screen-4.9.0.tar.gz
cd screen-4.9.0 && ./configure && make && sudo make install
Basic Usage
Starting Screen
bash
# Start new screen session
screen
# Start named session
screen -S sessionname
# Start session with command
screen -S mysession htop
# Start detached session
screen -d -m -S mysession
# Start session with specific shell
screen -S mysession bash
Session Management
bash
# List sessions
screen -ls
screen -list
# Attach to session
screen -r sessionname
screen -r 12345 # Using session ID
# Attach to session (force if attached elsewhere)
screen -d -r sessionname
# Detach from session
# Inside screen: Ctrl+a d
# Kill session
screen -S sessionname -X quit
# Kill all sessions
pkill screen
Key Bindings (Default Prefix: Ctrl+a)
Session Commands
Ctrl+a d # Detach from session
Ctrl+a D D # Detach and logout
Ctrl+a \ # Kill all windows and terminate
Ctrl+a : # Enter command mode
Window Commands
Ctrl+a c # Create new window
Ctrl+a n # Next window
Ctrl+a p # Previous window
Ctrl+a 0-9 # Switch to window by number
Ctrl+a " # List windows
Ctrl+a w # Show window list
Ctrl+a k # Kill current window
Ctrl+a A # Rename current window
Ctrl+a ' # Prompt for window number to switch to
Window Navigation
Ctrl+a Ctrl+a # Switch to last window
Ctrl+a l # Refresh screen
Ctrl+a L # Toggle login state
Ctrl+a M # Monitor window for activity
Ctrl+a _ # Monitor window for silence
Split Screen (Regions)
Ctrl+a S # Split horizontally
Ctrl+a | # Split vertically (if supported)
Ctrl+a Tab # Switch between regions
Ctrl+a Q # Close all regions except current
Ctrl+a X # Close current region
Copy Mode
Ctrl+a [ # Enter copy mode
Ctrl+a ] # Paste buffer
Ctrl+a > # Write buffer to file
Ctrl+a < # Read buffer from file
Copy Mode Navigation
Enter Copy Mode
Ctrl+a [ # Enter copy mode
Ctrl+a Esc # Enter copy mode (alternative)
Movement in Copy Mode
h, j, k, l # Move cursor (vi-style)
Arrow keys # Move cursor
w # Next word
b # Previous word
0 # Beginning of line
$ # End of line
g # Go to beginning of buffer
G # Go to end of buffer
Ctrl+f # Page down
Ctrl+b # Page up
/ # Search forward
? # Search backward
n # Next search result
N # Previous search result
Selection and Copy
Space # Start/end selection
Enter # Copy selection and exit copy mode
Esc # Exit copy mode
Configuration
Configuration File (~/.screenrc)
bash
# Basic settings
startup_message off
defscrollback 10000
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}]'
# Set default shell
shell -$SHELL
# Enable 256 colors
term screen-256color
# Mouse support (if available)
mousetrack on
# Automatically detach on hangup
autodetach on
# Change escape key
escape ^Aa # Default is Ctrl+a
# Window numbering
bind c screen 1
bind ^c screen 1
bind 0 select 10
screen 1
# Split screen bindings
bind | split -v
bind - split
bind + resize +5
bind = resize =
bind _ resize -5
# Window navigation
bind j focus down
bind k focus up
bind h focus left
bind l focus right
# Reload config
bind r source ~/.screenrc
# Logging
bind L log
# Monitor activity
bind m monitor
bind M monitor
Advanced Configuration
bash
# Status line customization
hardstatus on
hardstatus alwayslastline
hardstatus string "%{.bW}%-w%{.rW}%n %t%{-}%+w %=%{..G} %H %{..Y} %m/%d %C%a "
# Window titles
shelltitle "$ |bash"
# Startup windows
screen -t "editor" 1 vim
screen -t "server" 2
screen -t "logs" 3 tail -f /var/log/messages
# Key bindings for common tasks
bind ^k kill
bind k kill
bind ^\ quit
bind \\ quit
bind ^h hardcopy
bind h hardcopy
# Scrollback buffer
defscrollback 10000
# Visual bell
vbell on
vbell_msg " Wuff ---- Wuff!! "
# Activity monitoring
activity "Activity in %t(%n)"
# Silence monitoring
silence on
silencewait 15
# Automatic window naming
shelltitle '$ |bash'
# Password protection
password ODSJQf.4IJN7E # Encrypted password
# Multiuser mode
multiuser on
acladd user1,user2
Advanced Features
Multiple Users
bash
# Enable multiuser mode
screen -S shared
# In screen: Ctrl+a :multiuser on
# In screen: Ctrl+a :acladd username
# Other user connects
screen -x username/shared
Session Sharing
bash
# Start shared session
screen -S shared
# Allow others to attach
# In screen: Ctrl+a :multiuser on
# In screen: Ctrl+a :acladd otheruser
# Other user attaches
screen -x shared
Logging
bash
# Enable logging for window
# In screen: Ctrl+a H
# Log to specific file
# In .screenrc:
logfile /tmp/screen-%t.log
# Automatic logging
deflog on
Monitoring
bash
# Monitor window for activity
Ctrl+a M
# Monitor for silence
Ctrl+a _
# Set silence timeout (seconds)
# In .screenrc:
silencewait 30
Command Line Options
Session Management
bash
# Create detached session
screen -d -m -S mysession
# Create session and run command
screen -d -m -S mysession bash -c 'cd /var/log && tail -f messages'
# Send command to session
screen -S mysession -X stuff 'ls -la\n'
# Send command to specific window
screen -S mysession -p 0 -X stuff 'htop\n'
# Capture window content
screen -S mysession -p 0 -X hardcopy /tmp/screen.dump
Window Management
bash
# Create window with title
screen -S mysession -X screen -t "editor" vim
# Kill specific window
screen -S mysession -p 1 -X kill
# List windows
screen -S mysession -Q windows
Scripting
Automation Scripts
bash
#!/bin/bash
# dev-setup.sh
SESSION="development"
# Check if session exists
if ! screen -list | grep -q "$SESSION"; then
# Create new session
screen -d -m -S "$SESSION"
# Setup windows
screen -S "$SESSION" -X screen -t "editor" 1 vim
screen -S "$SESSION" -X screen -t "server" 2
screen -S "$SESSION" -X screen -t "logs" 3 tail -f /var/log/messages
# Send commands to windows
screen -S "$SESSION" -p 2 -X stuff 'cd ~/project && npm start\n'
# Select first window
screen -S "$SESSION" -X select 1
fi
# Attach to session
screen -r "$SESSION"
Batch Operations
bash
# Kill all sessions
screen -ls | grep Detached | cut -d. -f1 | awk '{print $1}' | xargs kill
# Send command to all windows
for i in {0..9}; do
screen -S mysession -p $i -X stuff 'echo "Hello from window $i"\n'
done
# Create multiple sessions
for name in web api db; do
screen -d -m -S "$name"
done
Integration
With SSH
bash
# Auto-start screen on SSH login
# Add to ~/.bashrc on remote server
if [ -z "$STY" ] && [ -n "$SSH_CONNECTION" ]; then
screen -RR ssh_session
fi
# Or use a function
ssh_screen() {
ssh -t "$1" 'screen -RR'
}
With System Services
bash
# Run service in screen
screen -d -m -S myservice /path/to/service
# Systemd service file
[Unit]
Description=My Service in Screen
After=network.target
[Service]
Type=forking
User=myuser
ExecStart=/usr/bin/screen -d -m -S myservice /path/to/service
ExecStop=/usr/bin/screen -S myservice -X quit
[Install]
WantedBy=multi-user.target
Comparison with tmux
Screen vs tmux
Screen:
+ Older, more stable
+ Simpler configuration
+ Better for basic use cases
+ Lower resource usage
- Less active development
- Fewer features
- Limited pane support
tmux:
+ More active development
+ Better pane management
+ More features
+ Better scripting support
- Steeper learning curve
- More complex configuration
Tips and Tricks
Productivity Tips
bash
# Quick session switching
alias s='screen -ls'
alias sr='screen -r'
alias sn='screen -S'
# Function to create or attach
sc() {
if [ $# -eq 0 ]; then
screen -ls
else
screen -r "$1" || screen -S "$1"
fi
}
# Nested screen sessions
# Change escape key for inner session
# In .screenrc: escape ^Bb
Useful Aliases
bash
# Add to ~/.bashrc
alias sl='screen -ls'
alias sr='screen -r'
alias ss='screen -S'
alias sk='screen -X -S'
# Function for easy session management
screen_session() {
case "$1" in
ls|list)
screen -ls
;;
new)
screen -S "$2"
;;
attach)
screen -r "$2"
;;
kill)
screen -S "$2" -X quit
;;
*)
echo "Usage: screen_session {ls|new|attach|kill} [session_name]"
;;
esac
}
Troubleshooting
Common Issues
bash
# Fix "Cannot open your terminal '/dev/pts/0'" error
script /dev/null
# Or use:
screen -x
# Dead session cleanup
screen -wipe
# Permission issues
chmod 755 /var/run/screen
# Check screen version
screen -v
# Debug mode
screen -d -m -L -S debug command
Recovery
bash
# Recover dead sessions
screen -D -R
# Force detach and reattach
screen -d sessionname
screen -r sessionname
# Clean up dead sessions
screen -wipe
Security
Access Control
bash
# Set password protection
# In .screenrc:
password your_encrypted_password
# Generate encrypted password
screen -X password
# Multiuser access control
multiuser on
acladd username
aclchg username +rwx "#"
Best Practices
bash
# Use named sessions
screen -S descriptive_name
# Regular cleanup
screen -wipe
# Monitor session activity
# In .screenrc:
activity "Activity in %t(%n)"
# Limit scrollback buffer
defscrollback 1000
Resources
- Official Documentation: gnu.org/software/screen
- Manual:
man screen
- Info:
info screen
- Examples:
/usr/share/doc/screen/examples/