Introduction
If you spend any amount of time in a Unix‑like shell, you’ve probably heard the terms tmux and screen whispered in the corridors of DevOps, system administration, and software development. Both are terminal multiplexers: programs that let you run multiple terminal sessions within a single physical terminal, detach from them, and reattach later—often from a completely different machine.
Why does this matter? Because modern work is increasingly remote, distributed, and interrupted. You might be hopping on a VPN, switching between laptops, or getting pulled away for a meeting. Without a multiplexer, every time you lose your SSH connection you lose the state of every interactive program you were running (vim, top, a REPL, a long‑running build, etc.). With tmux or screen, those programs keep running in the background, and you can pick up exactly where you left off.
This article provides a comprehensive, in‑depth guide to tmux and screen. We’ll cover:
- The history and philosophy behind each tool
- Core concepts: sessions, windows, panes, and more
- Installation and basic commands
- Advanced workflows: scripting, automation, and remote development
- Customization, plugins, and best‑practice patterns
- Real‑world examples and troubleshooting tips
By the end, you’ll be equipped to choose the right multiplexer for your workflow, configure it for maximum productivity, and avoid the common pitfalls that trip up newcomers.
1. Historical Context
1.1 The Birth of screen
screen was created in the early 1990s by Oliver Laumann and later maintained by the GNU Project. Its original purpose was to allow virtual consoles on a single physical terminal, a crucial feature before graphical X‑servers became ubiquitous. It quickly became a staple for remote administration because it allowed users to:
- Detach from a session and leave programs running.
- Reattach later, even from a different host.
- Share a session with another user for pair‑programming or troubleshooting.
Because screen is part of the GNU utilities, it ships on almost every Linux distribution and even on many BSDs and macOS (via Homebrew).
1.2 The Rise of tmux
tmux (short for terminal multiplexer) was released in 2007 by Nicholas Marriott as a modern alternative to screen. It was written in C, using the ncurses library, and introduced several design improvements:
| Feature | screen | tmux |
|---|---|---|
| Client–server architecture | No (single process) | Yes (separate server) |
| Dynamic pane resizing | Limited | Full, mouse support |
| Scripting with a clean API | Limited | Extensive tmux command interface |
| Plugin ecosystem | Minimal | Rich (TPM, many community plugins) |
| Configuration syntax | Legacy, cryptic | Modern, straightforward |
While screen remains widely installed, tmux has become the de‑facto standard for new projects, especially in cloud‑native environments where scriptability and extensibility are paramount.
2. Core Concepts
Both tools share a similar hierarchy, but the terminology differs slightly.
| Concept | screen | tmux |
|---|---|---|
| Top‑level container | session | session |
| Logical grouping of terminals | window | window |
| Subdivision of a window | region (via split) | pane |
| Detach/attach | Ctrl‑a d / screen -r | Ctrl‑b d / tmux attach |
Understanding these concepts is essential before diving into commands.
2.1 Sessions
A session is the top‑level entity. It holds a set of windows (or regions) and persists after you detach. In practice:
- screen: You can have multiple sessions, each with its own name (
screen -S mysession). - tmux: Sessions are named (
tmux new -s mysession) and can be listed (tmux ls).
2.2 Windows
A window is analogous to a tab in a modern terminal emulator. Each window runs its own shell (or any command). You can switch between windows quickly.
- screen:
Ctrl‑a "brings up a numbered list;Ctrl‑a n/pmoves next/previous. - tmux:
Ctrl‑b w(choose‑tree) orCtrl‑b n/p.
2.3 Panes (screen regions)
Panes let you split a single window into multiple viewports, each with its own process.
- screen: Uses
Ctrl‑a S(vertical split) orCtrl‑a |(horizontal). Navigation is clunkier. - tmux: Split with
Ctrl‑b "(horizontal) orCtrl‑b %(vertical). Resize withCtrl‑b Alt‑←/→/↑/↓.
3. Installation
3.1 Installing screen
On Debian/Ubuntu:
sudo apt-get update
sudo apt-get install screen
On Fedora:
sudo dnf install screen
On macOS (Homebrew):
brew install screen
3.2 Installing tmux
On Debian/Ubuntu:
sudo apt-get update
sudo apt-get install tmux
On Fedora:
sudo dnf install tmux
On macOS (Homebrew):
brew install tmux
Tip: Always aim for the latest stable version. On Ubuntu LTS you may need a PPA (ppa:jonathonf/tmux) to get tmux 3.3+.
4. Getting Started: Basic Commands
4.1 Starting a Session
screen
screen -S dev
You’ll be dropped into a new shell. The status line shows [dev].
tmux
tmux new -s dev
Tmux opens a status bar at the bottom with the session name.
4.2 Detaching and Re‑attaching
| Action | screen | tmux |
|---|---|---|
| Detach | Ctrl‑a d | Ctrl‑b d |
| List sessions | screen -ls | tmux ls |
| Re‑attach | screen -r dev | tmux attach -t dev |
| Re‑attach (any) | screen -r (if only one) | tmux attach (defaults to last) |
4.3 Creating and Navigating Windows
| Operation | screen | tmux |
|---|---|---|
| New window | Ctrl‑a c | Ctrl‑b c |
| List windows | Ctrl‑a " | Ctrl‑b w |
| Switch to window N | Ctrl‑a N (digit) | Ctrl‑b N |
| Rename window | Ctrl‑a A | Ctrl‑b , |
4.4 Splitting Panes
screen
Ctrl‑a S # split horizontally (creates a new region)
Ctrl‑a Tab # switch focus between regions
Ctrl‑a X # close current region
tmux
Ctrl‑b " # split horizontally
Ctrl‑b % # split vertically
Ctrl‑b o # rotate focus to next pane
Ctrl‑b x # kill current pane (confirm with y)
Resize panes (tmux only):
Ctrl‑b Alt‑← # shrink pane left
Ctrl‑b Alt‑→ # enlarge pane right
5. Advanced Session Management
5.1 Named Sessions for Projects
Creating a dedicated session per project isolates environments and reduces context switching.
# Start a session named "frontend"
tmux new -s frontend
# Inside, open a few windows:
tmux new-window -n server # window 0
tmux new-window -n client # window 1
tmux new-window -n docs # window 2
You can script this with a shell function:
function tmux_proj() {
local name=$1
tmux new-session -d -s "$name" -n editor # start detached
tmux new-window -t "$name":2 -n server
tmux new-window -t "$name":3 -n tests
tmux attach -t "$name"
}
# Usage:
tmux_proj myapp
5.2 Sharing Sessions for Pair Programming
Both screen and tmux support multi‑user access. This is handy for remote debugging.
tmux (requires chmod on the socket):
# On host A
tmux new -s shared
# Allow group read/write on the socket (default location: /tmp/tmux-1000/default)
chmod 770 /tmp/tmux-1000/default
# On host B (same user or same group)
tmux attach -t shared
screen (using multiuser mode):
# Enable multiuser in ~/.screenrc
multiuser on
deflogin on
acladd user2
# On host A
screen -S shared
# On host B
screen -x user1/shared # attach to the same session
5.3 Session Persistence Across Reboots
By default, sessions die with the host process. To keep long‑running sessions alive across reboots, combine tmux with a systemd user service.
~/.config/systemd/user/tmux.service:
[Unit]
Description=Tmux user session manager
[Service]
Type=forking
ExecStart=/usr/bin/tmux new-session -d -s persistent
ExecStop=/usr/bin/tmux kill-session -t persistent
Restart=always
[Install]
WantedBy=default.target
Enable and start:
systemctl --user enable tmux
systemctl --user start tmux
Now the persistent session survives user logouts and can be attached after a reboot.
6. Scripting and Automation
Both tools expose a command‑line interface that can be scripted from Bash, Python, or any language capable of executing shell commands.
6.1 tmux Command Syntax
The generic form is:
tmux [options] command [arguments]
Examples:
- Create a new window and run a command
tmux new-window -t mysession:3 -n "logs" "tail -f /var/log/syslog"
- Send keys to a pane
tmux send-keys -t mysession:2.1 "git status" C-m
- Capture pane output to a file
tmux capture-pane -t mysession:1.0 -p > pane_output.txt
These commands can be chained in a Bash script to bootstrap a development environment automatically.
6.2 screen Scripting
Screen offers -X to send commands to a running session.
screen -S dev -X screen 0 # switch to window 0
screen -S dev -X stuff "make clean$(printf \\r)"
Because screen’s command set is less consistent, many users opt for tmux when heavy automation is required.
6.3 Example: Automated Workspace for a Microservice
Below is a Bash script that creates a tmux workspace with three panes: a backend server, a frontend dev server, and a log tailer.
#!/usr/bin/env bash
set -e
SESSION="microservice"
tmux has-session -t "$SESSION" 2>/dev/null && {
echo "Session $SESSION already exists, attaching..."
tmux attach -t "$SESSION"
exit 0
}
# Start a new detached session
tmux new-session -d -s "$SESSION" -n "backend"
# Pane 0: backend server
tmux send-keys -t "$SESSION":0 "cd ~/projects/backend && npm start" C-m
# Split vertically for frontend
tmux split-window -h -t "$SESSION":0
tmux send-keys -t "$SESSION":0.1 "cd ~/projects/frontend && npm run dev" C-m
# Split horizontally for logs (bottom pane)
tmux split-window -v -t "$SESSION":0.0
tmux send-keys -t "$SESSION":0.2 "cd ~/projects/backend && tail -f logs/app.log" C-m
# Select the top-left pane for immediate interaction
tmux select-pane -t "$SESSION":0.0
# Attach
tmux attach -t "$SESSION"
Running this script (./dev_workspace.sh) instantly gives you a reproducible, shareable environment. Team members can simply tmux attach -t microservice to join.
7. Customization
Both multiplexers are highly configurable via dotfiles (~/.screenrc and ~/.tmux.conf). Below we explore common tweaks.
7.1 tmux.conf Essentials
# Enable mouse support (click to select panes, resize, etc.)
set -g mouse on
# Set prefix to Ctrl-a (like screen) – optional
unbind C-b
set -g prefix C-a
bind C-a send-prefix
# Status bar colors
set -g status-bg colour235
set -g status-fg colour136
set -g status-left '#[bg=colour236] #S #[default]'
set -g status-right '#[bg=colour236] %Y-%m-%d %H:%M #[default]'
# Show window list with icons
setw -g window-status-current-format '#[bg=colour29] #I:#W#F #[default]'
# Automatic renaming off (keep custom names)
set-option -g allow-rename off
Reload without restarting:
tmux source-file ~/.tmux.conf
7.2 screenrc Essentials
# Enable visual bell
vbell on
# Set hardstatus (status line) with colors
hardstatus alwayslastline "%{= kG}%-Lw%{= BW}%n %t%{-}%+Lw %=%{= kW}%Y-%m-%d %c"
# Turn on scrollback buffer (default is 100 lines)
defscrollback 5000
# Use Ctrl-a as prefix (default); change if you prefer Ctrl-z
escape ^Za
# Enable multiuser mode by default (use with care)
multiuser on
acladd user2
Apply changes by reloading:
Ctrl-a :source ~/.screenrc
7.3 Themes and Plugins
tmux Plugin Manager (TPM)
TPM simplifies installing community plugins.
- Install TPM:
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
- Add to
~/.tmux.conf:
# List of plugins
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'tmux-plugins/tmux-resurrect' # save/restore sessions
set -g @plugin 'tmux-plugins/tmux-continuum' # auto‑save
# Initialize TPM (keep at bottom of file)
run -b '~/.tmux/plugins/tpm/tpm'
- Press
Prefix + Ito install. Now you have session persistence (tmux-resurrect) and automatic backups (tmux-continuum).
screen Plugins
Screen does not have a formal plugin manager, but you can source external scripts. A popular add‑on is screen-utf8, which improves Unicode handling.
# In ~/.screenrc
source /usr/share/screen/utf8screenrc
8. Real‑World Use Cases
8.1 Remote Development on Low‑Bandwidth Connections
When you’re on a flaky cellular connection, you want to keep long‑running processes on the remote host. A typical workflow:
- SSH into the host.
- Start a tmux session (
tmux new -s work). - Run your IDE’s remote server (e.g.,
code-serverorvim). - Detach (
Ctrl-b d). If the connection drops, the server stays alive. - Re‑attach later, possibly from a different device.
Because tmux transmits only the terminal output, it uses far less bandwidth than a full X11 forwarding or VNC session.
8.2 Continuous Integration (CI) Debugging
CI jobs often run inside containers where you can’t SSH in after a failure. By wrapping the build steps in a tmux session and exposing the socket via a bind‑mount, you can later attach to the dead session for post‑mortem analysis.
RUN apt-get update && apt-get install -y tmux
CMD ["tmux", "new-session", "-d", "-s", "ci", "&&", "tmux", "send-keys", "-t", "ci", "make test", "C-m", "&&", "tmux", "wait-for", "-S", "ci"]
After the container exits, you can start a new container, mount the same /tmp/tmux-1000 directory, and attach to ci.
8.3 Pair Programming with Live Sharing
Using tmux’s multi‑user mode, two developers can edit the same file in real time, see each other’s cursor movements (via vim’s set mouse=a), and discuss changes over voice chat. The workflow is:
# User A
tmux new -s pair
# User B (same group)
tmux attach -t pair
Both users see the same panes, and any command (e.g., git push) runs once.
9. Troubleshooting Common Issues
| Symptom | Likely Cause | Fix |
|---|---|---|
Cannot attach: no such session | Session was never created or was killed. | Run tmux ls to list sessions. If none, start a new one. |
| Screen flickers or displays garbled characters | Incompatible $TERM or missing ncurses support. | Set TERM=xterm-256color before launching. Ensure your terminal emulator supports true colors. |
| Mouse scroll doesn’t work in tmux | Mouse mode disabled. | Add set -g mouse on to ~/.tmux.conf and reload. |
| Panes don’t resize after splitting | Terminal emulator is sending fixed-size updates. | Use a modern emulator like kitty, alacritty, or iTerm2. |
| Session disconnects after network drop | SSH client kills the remote process (e.g., ssh -o ServerAliveInterval=10). | Enable ServerAliveInterval or use mosh for UDP‑based persistence. |
| Screen “hardstatus” line disappears | hardstatus disabled in .screenrc. | Ensure hardstatus alwayslastline line is present. |
| tmux version too old (no plugin support) | Distribution ships older tmux (e.g., 2.6). | Install from source or use a PPA/third‑party repo. |
When debugging, the built‑in capture tools are invaluable:
# tmux: capture pane 0 of window 1
tmux capture-pane -t mysession:1.0 -p > pane.txt
# screen: dump region to file
Ctrl-a :hardcopy -h ~/screen_dump.txt
10. Best Practices and Tips
- Name everything – sessions, windows, and panes. It makes scripting and navigation trivial.
- Use a plugin manager – TPM for tmux; it saves you from manual git clones.
- Leverage mouse mode – it’s a huge productivity boost on modern terminals.
- Persist sessions –
tmux-resurrect+tmux-continuumcan automatically restore after reboots. - Avoid nested multiplexers – running tmux inside screen (or vice‑versa) can cause key‑binding conflicts. If you must, change the inner prefix.
- Standardize your config – keep a dotfiles repo (
~/.tmux.conf,~/.screenrc) and symlink across machines. - Use
set -g default-terminal "screen-256color"in tmux to improve compatibility with older programs. - Take advantage of
send-keysfor automated command execution, especially when launching long‑running services.
Conclusion
Terminal multiplexers may seem like niche utilities, but they are foundational tools for anyone who works in a command‑line environment. screen offers rock‑solid stability and near‑universal availability, making it a reliable fallback on minimal systems. tmux, on the other hand, provides a modern, extensible platform with superior pane management, scripting capabilities, and a vibrant plugin ecosystem.
Choosing between them often comes down to personal preference and the constraints of your environment. However, mastering both equips you to:
- Keep long‑running processes alive across disconnects.
- Share interactive sessions for collaboration and troubleshooting.
- Automate repetitive terminal setups with scripts.
- Build reproducible, portable development workspaces.
Invest a few hours to configure your .tmux.conf or .screenrc, explore the available plugins, and experiment with session scripts. The productivity gains—fewer lost jobs, smoother remote work, and a more organized terminal life—are well worth the effort.
Happy multiplexing!
Resources
- tmux Manual (official) – Comprehensive reference for all tmux commands and options.
- GNU Screen Documentation – The canonical guide for screen, covering advanced multi‑user setups.
- tmux Plugin Manager (TPM) – Install and manage tmux plugins with a single command.
- The Art of Multiplexing: tmux vs. screen – A comparative article from Linux Journal.
- mosh – Mobile Shell – Complementary tool for maintaining SSH connections over unstable networks.
- Vim in tmux – A Practical Guide – Tips for integrating Vim with tmux for seamless editing.