Cách dùng tmux: Quản lý nhiều terminal và giữ session khi SSH mất kết nối

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Vấn đề: Mở 10 tab terminal rồi vẫn bị mất hết khi SSH ngắt kết nối

Hồi mới bắt đầu làm việc với Linux server, mình có thói quen mở hàng chục tab terminal để theo dõi log, chạy lệnh, edit file — mỗi việc một tab. Trông có vẻ “ngầu” nhưng thực ra cực kỳ lộn xộn. Rồi một lần SSH vào VPS để deploy, đang chạy giữa chừng thì mạng cúp. Kết nối ngắt, tiến trình build chết, phải làm lại từ đầu. Đau lòng lắm.

Cái build đó mất 20 phút. Làm lại lần 2 thì lại gặp lỗi khác vì môi trường bị dở. Sau đận đó, mình học được bài học đắt giá — và tmux là thứ đầu tiên mình cài trên bất kỳ server mới nào.

Terminal thông thường: Hai điểm yếu chết người

Có hai vấn đề cốt lõi mà terminal thông thường (hay SSH thuần) không giải quyết được:

  • Session không bền vững: Khi kết nối SSH bị ngắt (mất mạng, laptop ngủ, timeout), tất cả tiến trình đang chạy đều bị kill ngay lập tức.
  • Không quản lý được nhiều cửa sổ: Mở nhiều tab SSH là nhiều kết nối riêng lẻ, không có cách nào nhìn tổng quan hay chuyển nhanh giữa các task.

Các junior thường dùng nohup hoặc & để chạy nền — đủ cho 1-2 lệnh đơn giản. Nhưng khi project phức tạp hơn (vừa theo dõi log, vừa chạy server, vừa edit config), nohup không giúp được gì nhiều.

So sánh các lựa chọn

Cách 1: Dùng nohup hoặc screen

nohup giữ tiến trình chạy khi logout, nhưng không có giao diện để tương tác lại. screen thì tốt hơn — tạo được session bền vững, attach/detach được — nhưng giao diện cổ, phím tắt khó nhớ, và không chia màn hình được như tmux.

Cách 2: Mở nhiều kết nối SSH song song

Dùng được, nhưng tốn tài nguyên. Mạng bất ổn thì vẫn mất hết cùng lúc. Không giải quyết được vấn đề gốc rễ.

Cách 3: Dùng tmux

tmux (terminal multiplexer) cho phép:

  • Tạo session tồn tại độc lập với SSH connection
  • Chia một cửa sổ terminal thành nhiều pane nhỏ
  • Chuyển đổi nhanh giữa các window và session
  • Detach rồi attach lại bất cứ lúc nào, từ bất kỳ máy nào

Làm chủ tmux từng bước

Bước 1: Cài đặt tmux

Trên hầu hết distro Linux, tmux có sẵn trong package manager:

# Ubuntu / Debian
sudo apt update && sudo apt install tmux -y

# CentOS / RHEL / Fedora
sudo dnf install tmux -y

# Arch Linux
sudo pacman -S tmux

# Kiểm tra version
tmux -V

tmux 3.x trở lên hỗ trợ mouse và có nhiều cải tiến đáng kể. Chạy tmux -V — nếu thấy tmux 3.2a hoặc cao hơn là ổn.

Bước 2: Hiểu cấu trúc 3 tầng của tmux

Trước khi gõ lệnh, nắm rõ 3 khái niệm này:

  • Session: Container lớn nhất. Một session có thể chứa nhiều window. Session tồn tại kể cả khi bạn detach.
  • Window: Tương đương tab trong terminal. Mỗi window chiếm toàn bộ màn hình.
  • Pane: Window có thể chia thành nhiều pane nhỏ, mỗi pane là một terminal độc lập.

Hình dung thế này: Session là văn phòng, Window là từng phòng làm việc, Pane là từng chiếc bàn trong phòng đó.

Bước 3: Các lệnh cơ bản từ ngoài terminal

# Tạo session mới (không đặt tên)
tmux

# Tạo session với tên cụ thể (khuyến khích)
tmux new-session -s deploy
tmux new -s monitoring   # viết tắt

# Liệt kê tất cả session đang chạy
tmux ls

# Attach vào session theo tên
tmux attach -t deploy
tmux a -t deploy         # viết tắt

# Attach vào session gần nhất
tmux a

# Xóa session
tmux kill-session -t deploy

Bước 4: Phím tắt bên trong tmux

Mọi lệnh trong tmux đều bắt đầu bằng prefix key — mặc định là Ctrl + b. Bấm prefix, thả ra, rồi mới bấm phím lệnh tiếp theo. Không bấm đồng thời cả ba.

Ví dụ: tạo window mới thì bấm Ctrl+b, thả ra, rồi bấm c.

Quản lý Session:

Ctrl+b d        # Detach khỏi session (session vẫn chạy ngầm)
Ctrl+b $        # Đổi tên session hiện tại
Ctrl+b s        # Xem danh sách session (có thể chọn để switch)

Quản lý Window:

Ctrl+b c        # Tạo window mới
Ctrl+b ,        # Đổi tên window hiện tại
Ctrl+b n        # Chuyển sang window tiếp theo
Ctrl+b p        # Chuyển sang window trước
Ctrl+b 0-9      # Nhảy thẳng tới window số 0, 1, 2...
Ctrl+b w        # Xem danh sách window để chọn
Ctrl+b &        # Đóng window hiện tại (có confirm)

Quản lý Pane:

Ctrl+b %        # Chia đôi màn hình theo chiều dọc
Ctrl+b "        # Chia đôi màn hình theo chiều ngang
Ctrl+b mũi tên  # Di chuyển giữa các pane
Ctrl+b z        # Zoom pane hiện tại (phóng to/thu nhỏ)
Ctrl+b x        # Đóng pane hiện tại (có confirm)
Ctrl+b q        # Hiện số thứ tự pane
Ctrl+b {        # Đổi vị trí pane sang trái
Ctrl+b }        # Đổi vị trí pane sang phải

Bước 5: Kịch bản thực tế khi deploy

Cách mình hay dùng khi deploy ứng dụng Node.js lên VPS:

# SSH vào server
ssh user@vps-ip

# Tạo session tên 'deploy'
tmux new -s deploy

# Chia pane: bên trái chạy lệnh deploy, bên phải xem log
Ctrl+b %

# Pane trái: chạy script deploy
git pull origin main && npm install && pm2 restart app

# Chuyển sang pane phải (Ctrl+b →)
# Pane phải: xem log realtime
pm2 logs app --lines 50

# Nếu mạng cúp, SSH lại và attach vào session cũ
tmux a -t deploy
# Mọi thứ vẫn còn đó!

Mình từng deploy một app có pipeline build mất 15 phút. Mạng cúp giữa chừng, SSH lại, attach vào session — build vẫn đang chạy, log đầy đủ, không mất gì cả.

Bước 6: Tùy chỉnh tmux với file cấu hình

File cấu hình nằm tại ~/.tmux.conf. Config tối giản bên dưới là điểm xuất phát tốt:

# Đổi prefix từ Ctrl+b sang Ctrl+a (quen tay hơn với ai dùng GNU screen)
# set-option -g prefix C-a
# unbind C-b
# bind C-a send-prefix

# Bật mouse — scroll được, click chọn pane được
set -g mouse on

# Đánh số window từ 1 thay vì 0 (bàn phím tự nhiên hơn)
set -g base-index 1
setw -g pane-base-index 1

# Tăng scrollback buffer lên 5000 dòng (mặc định 2000)
set -g history-limit 5000

# Thanh trạng thái hiển thị hostname và giờ
set -g status-right '%Y-%m-%d %H:%M'
set -g status-right-length 30

# Reload config mà không cần thoát tmux
bind r source-file ~/.tmux.conf \; display "Config reloaded!"

Sau khi chỉnh sửa, reload config bằng:

# Trong tmux, bấm:
Ctrl+b r

# Hoặc từ bên ngoài:
tmux source-file ~/.tmux.conf

Bước 7: Workflow nhiều session cho nhiều project

Mỗi project hoặc server nên là một session riêng — tổ chức theo kiểu này thì Ctrl+b s sẽ hiện ra menu chọn session rất tiện:

# Mỗi project/server là một session riêng
tmux new -s itfromzero    # Blog chính
tmux new -s monitoring    # Server monitoring
tmux new -s staging       # Môi trường staging

# Xem tổng quan tất cả
tmux ls
# itfromzero: 3 windows (created Fri Feb 28 09:00:00 2026)
# monitoring: 1 windows (created Fri Feb 28 08:30:00 2026)
# staging: 2 windows (created Fri Feb 28 10:15:00 2026)

# Chuyển qua lại giữa session từ bên trong tmux
Ctrl+b s   # Hiện menu chọn session

Tổng kết

Khoảng 10 phím tắt là đủ cho 80% công việc hàng ngày. Không cần học hết ngay.

Lộ trình học gợi ý:

  1. Cài tmux, tạo session đặt tên
  2. Luyện detach (Ctrl+b d) và attach lại (tmux a -t tên)
  3. Học chia pane (Ctrl+b %Ctrl+b ")
  4. Thêm set -g mouse on vào ~/.tmux.conf để dùng chuột
  5. Dần dần khám phá thêm tính năng khi cần

Cách học hiệu quả nhất là dùng tmux ngay trong công việc thực tế — lần đầu SSH vào server thì mở tmux luôn. Sau vài tuần, các phím tắt sẽ thành phản xạ mà không cần nhìn vào cheatsheet nữa.

Share: