Cách sử dụng tmux để quản lý nhiều terminal hiệu quả trên Linux server

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

Hồi mới bắt đầu làm sysadmin, mình từng mất cả buổi chiều chỉ vì một cái connection drop. Đang SSH vào server, đang theo dõi log của 3-4 tiến trình cùng lúc, đang debug một issue khó — internet ngắt một cái là mất hết context. SSH lại từ đầu, tìm lại process ID, cuộn log lại từ đầu. Cả tiếng đồng hồ bay hơi vì một cái network hiccup.

Sau 2-3 tháng chịu đựng kiểu đó, mình bắt đầu test từng giải pháp một. Dưới đây là kết quả thực tế — cái gì dùng được, cái gì không.

Các cách quản lý nhiều terminal — Nhìn toàn cảnh trước

Trước khi nói về tmux, cần điểm qua toàn bộ lựa chọn để hiểu tại sao người ta chọn cái này thay vì cái kia.

Terminal emulator tabs và cửa sổ

Cách đầu tiên ai cũng nghĩ đến: mở nhiều tab hoặc cửa sổ terminal. GNOME Terminal, Kitty, iTerm2 đều hỗ trợ. Không cần cài thêm gì, dùng ngay.

Giới hạn rõ ràng: chỉ hoạt động trên local machine. SSH vào server thì không có tabs nữa. Và khi kết nối bị ngắt, toàn bộ tiến trình đang chạy trong terminal bị kill theo.

nohup và background jobs

Dùng nohup command & hoặc disown để tiến trình tiếp tục chạy sau khi đóng terminal. Phù hợp cho script chạy một lần, không cần tương tác — ví dụ: backup chạy qua đêm 6-8 tiếng, bạn tắt laptop về nhà vẫn ổn.

Vấn đề: không thể “vào lại” để xem output real-time. Với các tác vụ cần giám sát liên tục — deploy, chạy migration, debug — cách này không đủ dùng.

GNU Screen

Screen là giải pháp terminal multiplexer đầu tiên, ra đời từ 1987. Hầu hết server Linux đều có sẵn, không cần cài thêm. Session tồn tại độc lập với connection — đây là điểm cộng lớn.

Nhưng mà… screen khá cứng đơ. Config phức tạp, phím tắt không intuitive — chia pane phải nhớ Ctrl+a S rồi Ctrl+a Tab, so với tmux thì thấy ngay sự khác biệt. Mình dùng screen khoảng 3 tuần rồi tìm thứ khác.

tmux

Terminal multiplexer hiện đại, được cộng đồng duy trì tích cực từ năm 2007. Session persistent, config linh hoạt qua file ~/.tmux.conf, layout chia pane mạnh, hỗ trợ scripting tốt.

Phân tích ưu nhược — Chọn tool nào cho hoàn cảnh nào?

Sau 6 tháng dùng cả 4 cách trên production, đây là nhận xét thực tế của mình:

  • Terminal tabs: Tốt cho local development, không cần học thêm. Hoàn toàn vô dụng khi làm việc với remote server.
  • nohup/disown: Dùng khi cần chạy một script dài mà không cần theo dõi. Ví dụ: backup đêm, cron job one-off.
  • screen: Dùng khi server quá cũ không có tmux và bạn không có quyền cài thêm. Hoặc khi phải SSH vào máy chủ của khách hàng lúc 2 giờ sáng mà không kịp cài gì.
  • tmux: Default choice cho mọi tác vụ cần persistent session và nhiều pane cùng lúc.

Nói thẳng: SSH vào server thường xuyên + cần làm nhiều việc song song = tmux. Không có cách nào khác trong danh sách này giải quyết được cả hai vấn đề đó cùng lúc.

Triển khai tmux — Từ cài đặt đến workflow thực tế

Cài đặt

# Ubuntu/Debian
sudo apt install tmux

# CentOS/RHEL/Rocky Linux
sudo dnf install tmux

# macOS
brew install tmux

# Kiểm tra version
tmux -V
# tmux 3.3a

Ba khái niệm cốt lõi cần hiểu trước

tmux có 3 layer lồng nhau. Hiểu đúng 3 cái này thì mọi thứ sẽ click ngay:

  • Session: Phiên làm việc độc lập. Tồn tại kể cả khi bạn disconnect khỏi server. Mình thường tạo 1 session per project hoặc per task lớn.
  • Window: Như tab trong trình duyệt, nằm trong session. Một session có thể có nhiều window.
  • Pane: Chia một window ra nhiều ô. Dùng để nhìn nhiều thứ cùng lúc — ví dụ: deploy script ở trên, log streaming ở dưới.

Phím tắt hay dùng nhất

Prefix mặc định của tmux là Ctrl+b. Bấm prefix xong rồi mới bấm tiếp phím lệnh.

# Quản lý session
Ctrl+b d            # Detach — thoát ra, session vẫn chạy nền
Ctrl+b $            # Đổi tên session hiện tại
tmux ls             # Xem danh sách sessions (gõ ngoài tmux)
tmux attach -t ten  # Vào lại session theo tên

# 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 / p        # Chuyển window tiếp / trước
Ctrl+b 0-9          # Chuyển thẳng đến window số X

# Quản lý pane
Ctrl+b %            # Chia đôi dọc (trái/phải)
Ctrl+b "            # Chia đôi ngang (trên/dưới)
Ctrl+b ←↑→↓         # Di chuyển giữa các pane
Ctrl+b z            # Zoom pane hiện tại (toggle fullscreen)
Ctrl+b x            # Đóng pane hiện tại

Workflow thực tế: Deploy và theo dõi log cùng lúc

Tình huống hay gặp nhất: cần chạy deploy script đồng thời xem log real-time. Với tmux:

# Tạo session mới tên "deploy"
tmux new -s deploy

# Chia pane theo chiều ngang: Ctrl+b "
# Pane trên: chạy deploy
./scripts/deploy.sh

# Di chuyển xuống pane dưới: Ctrl+b [mũi tên xuống]
# Pane dưới: xem log real-time
tail -f /var/log/app/production.log

Nếu giữa chừng connection drop — theo kinh nghiệm mình, điều này xảy ra khoảng 2-3 lần/tuần khi dùng VPS ở Đông Nam Á — chỉ cần SSH lại và:

tmux attach -t deploy

Mọi thứ vẫn y nguyên. Deploy vẫn chạy. Log vẫn stream. Không mất gì hết.

Cấu hình .tmux.conf cơ bản

Mặc định của tmux dùng được, nhưng vài thứ mình thêm ngay từ đầu:

# ~/.tmux.conf

# Bật mouse support (scroll, click chọn pane)
set -g mouse on

# Tăng scrollback history để xem log dài hơn
set -g history-limit 10000

# Đánh số window từ 1 thay vì 0
set -g base-index 1
setw -g pane-base-index 1

# Shortcut reload config không cần restart
bind r source-file ~/.tmux.conf \; display "Config reloaded!"

# Chia pane bằng | và - (dễ nhớ hơn ký tự mặc định)
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"

Sau khi sửa file, reload ngay không cần restart tmux:

tmux source-file ~/.tmux.conf
# Hoặc bấm Ctrl+b r nếu đã thêm bind r ở trên

Bonus: Tự động tạo workspace bằng script

tmux cho phép dựng layout tự động — rất tiện khi mỗi sáng cần setup lại môi trường làm việc:

#!/bin/bash
# setup-dev.sh

SESSION="dev"
tmux new-session -d -s $SESSION

# Window 1: editor
tmux rename-window -t $SESSION:1 "editor"
tmux send-keys -t $SESSION:1 "vim ." Enter

# Window 2: server + log (chia đôi)
tmux new-window -t $SESSION:2 -n "server"
tmux split-window -h -t $SESSION:2
tmux send-keys -t $SESSION:2.1 "npm run dev" Enter
tmux send-keys -t $SESSION:2.2 "tail -f logs/dev.log" Enter

# Attach vào session
tmux attach -t $SESSION

Chạy script này mỗi sáng là có ngay workspace đã setup sẵn — hai window, đúng layout, đúng lệnh.

Tổng kết sau 6 tháng dùng thực tế

tmux không phải công cụ học xong ngày đầu là dùng được hết. Mình bắt đầu chỉ với 5 phím tắt: tạo session, chia pane, di chuyển giữa pane, detach, attach lại. Chỉ vậy thôi đã giải quyết được 80% pain point hàng ngày.

Cái mình thấy giá trị nhất không phải tính năng fancy nào đó — mà là cảm giác yên tâm khi biết dù connection có drop, mọi thứ vẫn đang chạy và mình có thể vào lại bất cứ lúc nào. Với ai thường xuyên làm việc với Linux server, đó là sự khác biệt giữa một buổi chiều stress và một buổi chiều làm việc bình thường.

Nếu bạn mới bắt đầu, thử ngay với 3 lệnh: tmux new -s work, Ctrl+b " để chia pane, và Ctrl+b d để detach. Tuần đầu tiên chỉ cần nhớ vậy là đủ.

Share: