Open Source
tmux: เปลี่ยน terminal จอเดียวให้เป็นหลายจอ งานยาว ๆ ก็ไม่หายเมื่อ SSH หลุด
Gophernment Dev.to (EN Zone)
2026-09-05 07:20
3 views
📅 เขียนเมื่อ: กันยายน 2026 | อ้างอิง tmux 3.7 (stable ตั้งแต่ มิ.ย. 2026)
⚠️ คำสั่งหลักไม่เปลี่ยนมานานหลายปี แต่เช็คเวอร์ชันตัวเองก่อนได้ด้วย tmux -V
เรื่องเริ่มจาก SSH หลุดกลางคัน
เคยไหม — นั่ง SSH เข้า server เพื่อรันงานที่กินเวลานาน เช่น build โปรเจกต์, เท database, รันเทสทั้งชุด, หรือ train โมเดล พอเรากด Enter แล้วงานมันวิ่ง... เราก็ทำอย่างอื่นต่อ เผลอตัวไป 10 นาที กลับมาดูอีกทีเจอข้อความประมาณนี้
Connection to server closed by remote host.
SSH หลุดตอนไหนไม่รู้ งานที่รันอยู่ตายไปกับมันด้วย เพราะต้องเริ่มใหม่ตั้งแต่ต้น นั่งเฝ้าจอไม่กล้าขยับก็ไม่ได้เรื่อง ไหนจะเวลาทำงานปกติที่ต้องเปิด terminal ทีละหลายจอ — จอหนึ่งไว้แก้โค้ด อีกจอไว้ดู log อีกจอไว้รัน test แล้วก็สลับไปมาไม่ทัน
สองปัญหานี้มีทางออกตัวเดียว: tmux
tmux คืออะไร กันแน่
tmux (อ่านว่า ti-mux) ย่อมาจาก terminal multiplexer — โปรแกรมที่ทำให้ terminal จอเดียวของคุณกลายเป็น "หลาย terminal" ได้ในตัวเดียว เป็นโปรเจกต์ open source ที่ Nicholas Marriott สร้างและปล่อยครั้งแรกเมื่อปี 2007 แล้วดูแลกันมาเรื่อย ๆ ถึงทุกวันนี้ที่ github.com/tmux/tmux
หลักการทำงานมันประมาณนี้: พอคุณสั่ง tmux ครั้งแรก มันจะรัน server ตัวหนึ่งขึ้นมาคอยดูแล "หน้าจอ" ทั้งหมดของคุณ โดย server ตัวนี้ ไม่ได้ผูกติดกับ terminal ที่คุณเปิดอยู่ — มันรันอยู่เบื้องหลังของเครื่องนั้น ๆ
นี่คือกุญแจสำคัญของเรื่องทั้งหมด: ใน terminal ปกติ พอ SSH หลุด หรือเราปิดหน้าต่าง terminal กระบวนการที่รันอยู่ในนั้นก็โดนฆ่าตามไปด้วย เพราะมันเป็นลูกของ terminal นั้น แต่กับ tmux พอ SSH หลุด แค่ "จอที่เราใช้ดู" หลุดไป — server กับงานในนั้นยังรันต่อเงียบ ๆ พอ SSH กลับมาใหม่ เราก็แค่ "ต่อจอ" เข้าไปดูงานเดิมที่ยังวิ่งอยู่
ฟังดูดีใช่ไหม ต่อไปมาดูของใน tmux กันว่ามันแบ่งหน้าจอยังไง
session, window, pane — สามชั้นที่ซ้อนกัน
tmux มีโครงสร้าง 3 เลเยอร์ซ้อนกัน:
session — กลุ่มงานหนึ่ง ๆ เช่น session ชื่อ dev-project-a กับอีก session ชื่อ ops-server คุณมีกี่ session ก็ได้ แต่ละ session แยกกันเป็นอิสระ
window — หน้าจอภายใน session เปรียบเหมือนแท็บใน browser: session หนึ่งมีได้หลาย window แล้วสลับไปมา
pane — การแบ่ง window ออกเป็นช่อง ๆ ให้เห็นพร้อมกันหลายจอ
┌─ tmux ────────────────────────────────────────────────┐
│ Session: "dev" (กลุ่มงานทั้งหมด) │
│ ┌─ Window 0: code ─────────┐ ┌─ Window 1: server ──┐ │
│ │ pane 0: vim main.go │ │ pane 0: ssh prod │ │
│ │ ─────────────────────── │ └─────────────────────┘ │
│ │ pane 1: go run . │ │
│ └──────────────────────────┘ │
│ [dev] 0:code* 1:server 14:32 │
└────────────────────────────────────────────────────────┘
แถบล่างสุดคือ status bar — บอกว่าอยู่ session ไหน (dev), มี window อะไรบ้าง (ตัวเลข 0:code* ที่มีดอกจันคือ window ที่กำลังดูอยู่), และเวลาปัจจุบัน
จำง่าย ๆ ว่า session ใหญ่สุด ครอบ window ครอบ pane — session คือ "ห้องทำงาน", window คือ "โต๊ะทำงาน" ที่สลับกันได้, pane คือ "เอกสารที่วางบนโต๊ะเดียวกัน" ให้เห็นพร้อมกัน
คำสั่งพื้นฐานที่ใช้จริงทุกวัน
สามคำที่เพิ่งพูดถึง (session, window, pane) จะโผล่ในทุกคำสั่งด้านล่าง และก่อนอื่นต้องติดตั้งให้ได้ก่อน — macOS ใช้ Homebrew ส่วน Ubuntu/Debian (รวม Raspberry Pi OS) ใช้ apt:
# macOS
brew install tmux
# Ubuntu / Debian / Raspberry Pi OS
sudo apt install tmux
# เช็คว่าได้เวอร์ชันอะไร
tmux -V
เริ่ม session แรก
tmux new -s dev # สร้าง session ใหม่ชื่อ dev แล้วเข้าไปเลย
tmux ls # (รันนอก session) ดูว่ามี session ไหนรันอยู่บ้าง
tmux attach -t dev # กลับเข้า session ที่ชื่อ dev
tmux kill-session -t dev # ปิด session dev ให้สิ้นซาก
ถ้ารันแค่ tmux เฉย ๆ ก็ได้ — มันจะตั้งชื่อ session ให้เองแบบสุ่ม แต่การตั้งชื่อเอง (-s dev) จะทำให้จำง่ายเวลาเจอหลาย session พร้อมกัน
ปุ่ม "เรียก" ที่ชื่อ prefix
นี่คือหัวใจของ tmux ที่มือใหม่งงที่สุด: การจะสั่งอะไรใน tmux คุณต้องกด prefix ก่อนทุกครั้ง — ค่า default คือ Ctrl-b แปลว่ากด Ctrl ค้างไว้แล้วกด b พร้อมกัน แล้วปล่อย ตามด้วยปุ่มคำสั่ง เช่น
กด Ctrl-b แล้วกด d → คำสั่ง detach — หลุดออกจาก session แต่ session ยังรันต่อ
ลองคิดว่า Ctrl-b คือ "นี่ฉันจะสั่ง tmux นะ" แล้วปุ่มถัดไปคือ "สั่งอะไร" — เหมือนกด ⌘ หรือ Ctrl แล้วตามด้วยคีย์ลัดนั่นแหละ
ชุดคำสั่งที่ใช้บ่อยจริง ๆ เก็บไว้แค่นี้:
Ctrl-b d detach: หลุดออกจาก session แต่ session ยังรันต่อ
Ctrl-b c สร้าง window ใหม่ (เหมือนเปิดแท็บใหม่)
Ctrl-b 0-9 สลับไป window ที่ 0-9
Ctrl-b , ตั้งชื่อ window ปัจจุบัน (เช่น "code", "log")
Ctrl-b % แบ่ง pane ซ้าย-ขวา
Ctrl-b " แบ่ง pane บน-ล่าง
Ctrl-b o กระโดดไป pane ถัดไป
Ctrl-b [ เลื่อนดู history ที่เลื่อนผ่านไปแล้ว (กด q เพื่อออก)
Ctrl-b x ฆ่า pane ปัจจุบัน
Ctrl-b & ฆ่า window ปัจจุบัน
เทคนิคจำ % กับ " ให้ได้: เครื่องหมาย % มีวงกลมสองวงอยู่ซ้าย-ขวา → ได้ pane ซ้าย-ขวา ส่วน " เป็นขีดตรงสองขีดเรียงคู่กัน → ได้ pane บน-ล่าง (สังเกตว่าผมเขียนเป็น "ซ้าย-ขวา/บน-ล่าง" ตามผลที่ได้ ไม่ใช่ศัพท์ vertical/horizontal ในเอกสาร — เพราะคนส่วนใหญ่รวมถึงผมตอนแรก งงกับคำนี้ประจำ)
และปุ่มที่ควรกดเป็นอย่างแรก ๆ คือ Ctrl-b ? — มันจะโชว์ key binding ทั้งหมดให้ดู ใครลืมอะไรให้กดอันนี้ก่อน
สถานการณ์จริง: งานยาว + จอแบ่งครึ่ง
1. SSH รันงานยาว แล้วเดินออกจากจอได้สบาย ๆ
ตัวอย่างจริงที่เจอทุกอาทิตย์ — เข้า server เพื่อรัน migration หรือ train โมเดลที่กินเวลาหลายชั่วโมง:
ssh user@server
tmux new -s train # เปิด session ชื่อ train
python train.py # รันงานยาว ๆ
Ctrl-b d # detach กลับมาที่ shell ปกติ
logout # ปิด SSH ได้เลย ไม่ต้องเฝ้า
ทีนี้ปิด notebook ไปนอนได้เลย พอตื่นมา:
ssh user@server
tmux attach -t train # เห็น output ต่อจากบรรทัดเดิม งานยังวิ่งอยู่!
ความต่างจากเมื่อก่อนคือชัดเจน: ไม่ต้องนั่งเฝ้าจอ ไม่ต้องกลัว wifi หลุด — งานมันอยู่ใต้การดูแลของ tmux server ไม่ใช่ใต้ SSH connection ที่เปราะบางของคุณ
2. จอเดียว เห็นทั้งโค้ด ทั้ง log
อีกสถานการณ์ที่ใช้ทุกวัน — แก้บั๊กที่ต้องดู log ประกอบ:
tmux new -s fixbug # เปิด session
vim main.go # แก้โค้ด
Ctrl-b % # แบ่งจอซ้าย-ขวา
# พอ cursor ไปอยู่ฝั่งขวา:
tail -f /var/log/app.log # ดู log ไหลสด ๆ
Ctrl-b o # กระโดดกลับไป pane ซ้าย แก้โค้ดต่อ
ได้ผลลัพธ์แบบนี้ — ฝั่งซ้าย vim, ฝั่งขวา log ไหลสด แก้โค้ดปุ๊บเห็นผลปั๊บ ไม่ต้องสลับหน้าต่างไปมา:
┌─ pane 0: vim main.go ─────┬─ pane 1: tail -f log ────┐
│ func main() { │ 14:31:02 request /login │
│ server.Run() │ 14:31:02 200 OK (42ms) │
│ } │ 14:31:03 request /pay │
│ │ 14:31:03 500 ERROR! │
└───────────────────────────┴──────────────────────────┘
ถ้าอยากให้ pane ไหนเต็มจอชั่วคราว (เช่นอยากจดจ่อกับ vim) กด Ctrl-b z เพื่อ zoom อีกทีก็กลับมาเป็นจอแบ่งเหมือนเดิม
ปรับ .tmux.conf ให้เข้ากับมือ
ทุกครั้งที่เปิด tmux มันจะอ่าน config จากไฟล์ ~/.tmux.conf ที่บ้านคุณ — ไฟล์นี้จะยังไม่มีในเครื่องใหม่ สร้างเองได้เลย นี่คือชุดเริ่มต้นที่เพื่อน ๆ หลายคนใช้กัน (รวมถึงผม) พร้อมคำอธิบายทีละบรรทัด:
# เปลี่ยนปุ่ม "เรียก" จาก Ctrl-b เป็น Ctrl-a
# (Ctrl-a อยู่แถว home row กดถนัดกว่า — แต่ถ้าไม่ชินก็ข้าม 3 บรรทัดนี้ไปได้)
unbind C-b
set -g prefix C-a
bind C-a send-prefix # กด Ctrl-a สองที = ส่ง Ctrl-a จริง ๆ ให้โปรแกรมข้างใน
# เปิดโหมดเมาส์: คลิกเลือก pane, ลากขอบแบ่งขนาด, เลื่อนดู history เก่า
set -g mouse on
# ให้ window และ pane เริ่มนับที่ 1 (เริ่มที่ 0 แล้วงงทุกที)
set -g base-index 1
setw -g pane-base-index 1
# เพิ่ม buffer ให้เลื่อนดู history ได้ 5,000 บรรทัด (default 2,000)
set -g history-limit 5000
# reload config โดยไม่ต้องออกจาก tmux: กด prefix แล้ว r
bind r source-file ~/.tmux.conf
ถ้าแก้ config ตอนที่ยังไม่ได้ bind r (รอบแรก) ก็ reload มือได้: ใน tmux กด Ctrl-b ตามด้วย : พิมพ์ source-file ~/.tmux.conf แล้ว Enter — หรือง่ายสุดคือออกแล้วเข้า tmux ใหม่ เพราะมันอ่าน config อัตโนมัติทุกครั้งที่เริ่ม
ข้อควรจำ: ถ้าคุณเปลี่ยน prefix เป็น Ctrl-a ตาม config ด้านบน คำสั่งทุกอันที่ผมยกตัวอย่างด้วย Ctrl-b ข้างต้นก็ให้เปลี่ยนเป็น Ctrl-a ตามไปด้วยทั้งหมด
สรุป: เริ่มจาก session เดียวก่อน
tmux อาจดูน่ากลัวตอนแรกเพราะมีปุ่มลัดเยอะ แต่ความจริงคุณไม่ต้องจำทั้งหมด — จุดเริ่มต้นง่าย ๆ แค่เริ่ม session ด้วย tmux new -s <ชื่อ> จำ Ctrl-b d ไว้ตอนอยาก detach (งานไม่ตายแน่นอน) กลับมาทีหลังก็ tmux attach -t <ชื่อ> และที่เหลือถ้าลืมเมื่อไหร่ มี Ctrl-b ? ไว้เปิดดูคำสั่งทั้งหมดเสมอ
พอคล่องแล้วค่อยเพิ่ม window, pane, แล้วค่อยปรับ .tmux.conf — ส่วนผมตอนนี้ เปิด terminal ทีละสิบจอเป็นเรื่องของอดีตไปแล้ว และที่สำคัญกว่านั้น คืนไหนที่ต้องรันงานยาว SSH หลุดตอนไหนก็หลับได้สบาย
แหล่งอ้างอิง
tmux GitHub repository — release 3.7 (มิ.ย. 2026) และ CHANGES
tmux manual page — รายละเอียดคำสั่งและ key binding ตามค่า default
What's New in tmux — สรุป feature ใหม่ตั้งแต่ 3.4 เป็นต้นมา
Read original: https://dev.to/gophernment/tmux-epliiyn-terminal-cchediiywaihepnhlaaycch-ngaanyaaw-kaimhaayemuue-ssh-hlud-1e4p