กลับไปหน้าบทความ
#tmux#Ubuntu#SSH#Terminal#DevOps

ใช้ tmux บน Ubuntu ให้งานรันต่อแม้ปิด SSH หรือ Terminal

เรียนรู้วิธีใช้ tmux บน Ubuntu เพื่อให้งานที่ใช้เวลานานทำงานต่อหลังตัดการเชื่อมต่อ SSH พร้อมคำสั่งสำหรับสร้าง ถอด และกลับเข้าสู่ session รวมถึงการจัดการหน้าต่างและ pane เบื้องต้น

9 สิงหาคม 2569อ่านประมาณ 2 นาที

แชร์บทความ

ใช้ tmux บน Ubuntu ให้งานรันต่อแม้ปิด SSH หรือ Terminal

การรันคำสั่งที่ใช้เวลานานผ่าน SSH มีความเสี่ยงที่งานจะหยุดเมื่อหน้าต่าง Terminal ถูกปิด อินเทอร์เน็ตหลุด หรือโน้ตบุ๊กตัดการเชื่อมต่อ ปัญหานี้เกิดขึ้นได้กับงานหลายประเภท เช่น การอัปโหลดไฟล์ รัน migration สร้างโปรเจกต์ ดาวน์โหลดโมเดล หรือสำรองข้อมูล

tmux ช่วยแยกงานที่กำลังรันออกจากหน้าต่าง Terminal ของผู้ใช้ ทำให้เราตัดการเชื่อมต่อจากเซิร์ฟเวอร์และกลับมาเปิดหน้าจอเดิมภายหลังได้ โดยงานภายใน tmux จะยังทำงานต่อไปตราบใดที่เซิร์ฟเวอร์ยังเปิดอยู่และโปรเซสไม่ได้หยุดเพราะข้อผิดพลาดอื่น

tmux คืออะไรและช่วยเรื่องใด

ชื่อ tmux ย่อมาจาก terminal multiplexer ซึ่งเป็นเครื่องมือสำหรับสร้าง session ที่บรรจุหน้าต่างและส่วนแบ่งหน้าจอหลายส่วนไว้ภายใน เมื่อเปิด tmux หลังเชื่อมต่อ SSH งานที่รันจะผูกกับ session ของ tmux แทนการผูกกับ SSH session โดยตรง

ด้วยวิธีนี้ การปิด Terminal ปิดฝาโน้ตบุ๊ก หรือหลุดจากเครือข่ายจะไม่ทำให้งานใน tmux หยุดทันที เมื่อเชื่อมต่อกลับมายังเซิร์ฟเวอร์ เราสามารถเข้าสู่ session เดิมและเห็นสถานะหน้าจอพร้อมผลลัพธ์ที่ยังคงทำงานต่อเนื่อง

ติดตั้ง tmux บน Ubuntu

เริ่มต้นด้วยการอัปเดตรายการแพ็กเกจและติดตั้ง tmux ผ่าน apt การติดตั้งต้องใช้สิทธิ์ผู้ดูแลระบบ จึงควรรันคำสั่งต่อไปนี้ด้วยบัญชีที่ใช้ sudo ได้

sudo apt update
sudo apt install tmux

เมื่อติดตั้งเสร็จแล้ว ให้สร้าง session ใหม่ด้วยชื่อที่สื่อถึงหน้าที่ของงาน ตัวอย่างต่อไปนี้สร้าง session ชื่อ deploy แต่สามารถเปลี่ยนเป็นชื่ออื่น เช่น worker, backup หรือ train ได้

tmux new -s deploy

หลังเข้าสู่ session แล้ว สามารถรันงานตามปกติ เช่น worker ของ Python หรือการ build โปรเจกต์ งานเหล่านี้จะทำงานอยู่ภายใน session ที่สร้างไว้

python3 worker.py
npm run build

ออกจาก session โดยไม่หยุดงาน

หากต้องการกลับไปยัง shell ปกติโดยปล่อยให้งานทำต่อ ให้ใช้กระบวนการที่เรียกว่า detach โดยกด Ctrl+b แล้วปล่อยมือ จากนั้นกด d หน้าจอจะออกจาก tmux แต่ session และโปรเซสภายในยังทำงานอยู่เบื้องหลัง

ไม่ควรกด Ctrl+c หากต้องการให้งานทำต่อ เพราะปุ่มดังกล่าวจะส่งสัญญาณขัดจังหวะไปยังโปรเซสปัจจุบันและอาจทำให้งานหยุด หลัง detach แล้วจึงสามารถ logout จาก SSH หรือปิด Terminal ได้ตามปกติ

กลับเข้าสู่ session เดิม

เมื่อเชื่อมต่อ SSH กลับมายังเซิร์ฟเวอร์ ให้ใช้คำสั่งต่อไปนี้เพื่อเข้าสู่ session ชื่อ deploy อีกครั้ง หากโปรเซสยังทำงานอยู่ เราจะกลับมาเห็นหน้าจอและสถานะเดิมได้ทันที

tmux attach -t deploy

หากจำชื่อ session ไม่ได้ ให้แสดงรายการ session ทั้งหมดก่อน แล้วจึงเลือกชื่อที่ต้องการกลับเข้าไป วิธีตั้งชื่อแยกตามหน้าที่ช่วยลดความสับสนเมื่อรันหลายงานพร้อมกัน

tmux ls
tmux attach -t backup

คำสั่งพื้นฐานที่ควรจำมีดังนี้:

  • tmux new -s ชื่อ สร้าง session ใหม่
  • Ctrl+b แล้วกด d ออกจาก session โดยไม่หยุดงาน
  • tmux ls แสดงรายการ session ที่มีอยู่
  • tmux attach -t ชื่อ กลับเข้าสู่ session ที่ต้องการ

จัดการหน้าต่างและ pane ภายใน tmux

หนึ่ง session สามารถมีหลายหน้าต่างได้ เช่น ใช้หน้าต่างแรกดู log และใช้อีกหน้าต่างตรวจสอบทรัพยากรของระบบ หากต้องการสร้างหน้าต่างใหม่ ให้กด Ctrl+b แล้วกด c จากนั้นใช้ Ctrl+b ตามด้วย n เพื่อไปหน้าต่างถัดไป หรือ p เพื่อกลับไปหน้าต่างก่อนหน้า

ภายในแต่ละหน้าต่างยังสามารถแบ่งพื้นที่เป็น pane เพื่อดูหลายคำสั่งพร้อมกันได้ การแบ่งซ้ายขวาใช้ Ctrl+b แล้วกด % ส่วนการแบ่งบนล่างใช้ Ctrl+b แล้วกด " และสามารถย้ายระหว่าง pane ด้วย Ctrl+b ตามด้วยปุ่มลูกศร

ตัวอย่างการใช้งานคือเปิด pane หนึ่งสำหรับติดตาม log แล้วใช้อีก pane ตรวจสอบสถานะระบบ ทำให้จัดการงานที่เกี่ยวข้องกันได้จาก session เดียวโดยไม่ต้องเปิด SSH หลายหน้าต่าง

tail -f app.log

ปิด session อย่างถูกต้อง

หากงานเสร็จแล้วและต้องการปิด session จริง ๆ ให้กลับเข้าไปใน session แล้วพิมพ์ exit ในทุก shell ที่เปิดอยู่ เมื่อ shell สุดท้ายปิดลง session นั้นจะสิ้นสุดโดยอัตโนมัติ

อีกวิธีคือสั่งปิด session จาก shell ภายนอกด้วยคำสั่ง kill-session แต่คำสั่งนี้จะหยุดโปรเซสทั้งหมดที่อยู่ใน session ด้วย จึงควรตรวจสอบให้แน่ใจก่อนว่าไม่มีงานสำคัญค้างอยู่

tmux kill-session -t deploy

ข้อจำกัดและการเก็บ log

tmux ช่วยป้องกันงานหยุดจากการตัดการเชื่อมต่อ SSH แต่ไม่ได้ทำให้งานทนต่อปัญหาทุกประเภท หากเซิร์ฟเวอร์รีบูต ดิสก์เต็ม โปรแกรมเกิดข้อผิดพลาด หรือโปรเซสถูกระบบยุติ งานก็ยังสามารถหยุดได้ตามปกติ

สำหรับงานสำคัญ ควรเขียนผลลัพธ์และข้อผิดพลาดลงไฟล์ log เพื่อให้ตรวจสอบย้อนหลังได้ ตัวอย่างต่อไปนี้บันทึกทั้ง standard output และ standard error ลงในไฟล์ worker.log

python3 worker.py > worker.log 2>&1

ควรทดลองคำสั่งกับงานขนาดเล็กก่อนปล่อยงานที่ใช้เวลานาน และตรวจสอบพื้นที่ดิสก์รวมถึงทรัพยากรของเซิร์ฟเวอร์ให้เพียงพอ วิธีนี้ช่วยลดความเสี่ยงที่งานจะหยุดด้วยสาเหตุซึ่ง tmux ไม่สามารถป้องกันได้

ทดลองใช้งานด้วยงานง่าย ๆ

เริ่มฝึกด้วยการสร้าง session ชื่อ test แล้วใช้ watch แสดงเวลาปัจจุบันทุกหนึ่งวินาที จากนั้น detach ปิดการเชื่อมต่อ SSH และเชื่อมต่อกลับมาใหม่เพื่อทดสอบว่าโปรเซสยังทำงานอยู่

tmux new -s test
watch -n 1 date

เมื่อคำสั่งทำงานแล้ว ให้กด Ctrl+b ตามด้วย d และออกจาก SSH หลังเชื่อมต่อกลับมา ให้เข้าสู่ session เดิมด้วยคำสั่งต่อไปนี้ หากเวลาบนหน้าจอยังคงเปลี่ยนทุกวินาที แสดงว่า tmux ทำงานสำเร็จ

tmux attach -t test

สรุป

tmux เป็นเครื่องมือพื้นฐานที่มีประโยชน์มากสำหรับผู้ที่ต้องรันงานระยะยาวบน Ubuntu ผ่าน SSH หัวใจสำคัญคือสร้าง session รันงานภายในนั้น detach เมื่อต้องการตัดการเชื่อมต่อ และ attach กลับมาเมื่อต้องการตรวจสอบงาน

เมื่อใช้งานร่วมกับการตั้งชื่อ session ที่ชัดเจนและการบันทึก log ลงไฟล์ งานบนเซิร์ฟเวอร์จะจัดการและตรวจสอบได้ง่ายขึ้น แม้หน้าต่าง Terminal จะถูกปิดหรือเครือข่ายหลุด งานก็ไม่ต้องผูกชะตาไว้กับการเชื่อมต่อ SSH เพียงครั้งเดียว