Tutorial

นายเองก็ดูเทพได้นะ ด้วย tmux น่ะ

By Arnon Puitrakul - 06 มกราคม 2025

นายเองก็ดูเทพได้นะ ด้วย tmux น่ะ

เมื่อหลายวันก่อน เราไปทำงานแล้วใช้ Terminal แบบปีศาจมาก ๆ จนเพื่อนถามว่า เราทำยังไงถึงสามารถสลับ Terminal Session ไปมาได้แบบบ้าคลั่งขนาดนั้น เบื้องหลังของผมน่ะเหรอกัปตัน ผมใช้ tmux ยังไงละ วันนี้เราจะมาแชร์ให้อ่านกันว่า มันเอามาใช้งานจริงได้อย่างไร เป็น Beginner Guide สำหรับคนที่อยากลองละกัน

Installing tmux

// Homebrew
$ brew install tmux

// apt
$ sudo apt get install tmux

tmux ไม่ได้เป็นโปรแกรมที่ติดมากับเครื่อง ดังนั้น เราจะต้องติดตั้งกันก่อน โดยเราสามารถติดตั้งผ่าน Homebrew ได้ง่าย ๆ หรือ ถ้าใครใช้ Linux Distro ตัวไหน ก็ลองดูใน Package Manager ที่อยู่ในเครื่องของเราได้เลยว่า เราใช้ตัวไหน เราว่ามันน่าจะมีหมดนะ เท่าที่เราลองใช้บน macOS ผ่าน Homebrew และ Ubuntu ผ่านทั้ง apt และ LinuxBrew มันก็ติดตั้งตามนี้ได้เลย

$ tmux -V
tmux 3.5a

หลังติดตั้ง ให้เราเช็คอีกครั้งว่า เราสามารถเรียกมันได้อย่างถูกต้องหรือไม่ ง่าย ๆ ด้วยการขอเลข Version มันเลยละกันด้วย Argument -V ย้ำกว่า V ตัวพิมพ์ใหญ่นะ

Basic Terminology: Session, Window, Pane

ก่อนเราจะไปลองใช้งานกัน เราอยากจะต้องมาทำความเข้าใจหลักการทำงานพื้นฐานกันก่อน โดยการใช้ Terminal บน tmux มันจะมี 4 คำที่เราจะต้องทำความเข้าใจกันก่อน

Session เป็นหน่วยใหญ่ที่สุดของ tmux ที่ภายในมันจะประกอบด้วย Window และ Pane เราสามารถสร้าง Session ได้จากการสั่งรัน tmux บน Terminal โดยเมื่อเราเข้ามาแล้ว เราจะเห็นว่า เราได้หน้า Terminal เหมือนที่เราเปิดทั่วไป แต่เราจะได้แถบด้านล่างติดมาด้วย

ในแต่ละ Session เราสามารถใส่หลาย Window ได้ คิดภาพง่าย ๆ เหมือนเราเปิดหน้าต่างใหม่ใน macOS และ Windows เลย แค่ว่า Window บน tmux มันไม่สามารถขยับได้อย่างอิสระเหมือนกับ GUI ที่เราใช้งานกันปกตินั่นเอง

ในแต่ละ Window เราสามารถใส่ได้หลาย Pane เหมือนโปรแกรมสมัยก่อนที่เราเปิดมาแล้ว สามารถทำงานได้หลาย ๆ หน้าต่างย่อย ซึ่งใน tmux เราสามารถแบ่งครึ่งแนวตั้ง หรือแนวนอนแล้วแต่ที่เราสะดวกเลย

และสุดท้าย ไม่เกี่ยวกับโครงสร้างละ แต่เกี่ยวกับ Shortcut ที่เราจำเป็นต้องใช้ เวลาจะกด Shortcut ทุกอย่างใน tmux เราจะต้องเริ่มจากการกดสิ่งที่เรียกว่า Binding หรือ Prefix กันก่อน โดยค่าพื้นฐาน เราจะใช้ Control + B ปล่อยมือแล้วค่อยตามด้วย Shortcut ที่เราต้องการแค่นั้น ต่อจากนี้ ถ้าเราบอกว่า Prefix + ตัวหนังสือ ก็คือให้เรากด Control + B แล้วปล่อยมือ แล้วตามด้วยตัวหนังสือนั้น ๆ

tmux new -s <session_name>

tmux new -s data_analysis

เรามาเริ่มจากการกระโดดข้ามไปมาระหว่าง Session กันก่อน โดยทั่วไป หากเราเรียก tmux เฉย ๆ มันก็จะสร้าง Session ที่ไม่มีชื่อมาให้เรา เราสามารถตั้งชื่อให้มันได้ โดยใส่ Argument -s แล้วตามด้วยชื่อ Session ก็ได้ ตัวอย่างด้านบนเป็นการสร้าง Session ใหม่ที่ชื่อ data_analysis

นายเองก็ดูเทพได้นะ ด้วย tmux น่ะ

เมื่อเราเข้ามา ให้เราสังเกตด้านล่างซ้ายมือ มันจะมีเขียนชื่อ Session ให้เราอยู่ ดังนั้นเวลาเราสลับ Session ไปมา ให้เราดูด้วยนะว่า เราอยู่ที่ Session ไหน ไม่ใช่ว่า สลับไปมา งง กันเองซะงั้น ฮ่า ๆ

$ tmux new -s data_pipeline -d
$ tmux ls
0: 1 windows (created Sun Jan  5 20:02:42 2025)
data_analysis: 1 windows (created Sun Jan  5 20:25:52 2025) (attached)
data_pipeline: 1 windows (created Sun Jan  5 20:28:23 2025)

ทีนี้ เราจะลองสร้าง Session ใหม่กันดู อาจจะชื่อว่า data_pipeline เราก็ใช้คำสั่งเดิมได้เลย แต่ใส่ -d ลงไปเพื่อบอกว่า ให้มัน Detach ออกไปก่อนนะ อย่าพึ่ง Attach เข้ามาตอนนี้ โดยเราสามารถขอดูได้ว่า ณ ตอนนี้เรามี Session ใดเปิดอยู่บ้างด้วยคำสั่ง ls ก็จะเห็นว่า ตอนนี้เรามี 2 Session เปิดอยู่

$ tmux attach -t data_analysis

เราสามารถกลับมารัน Session เดิมได้อีกครั้ง ด้วยคำสั่ง attach แต่เราควรที่จะทำนอก tmux นะ ไม่งั้นมันจะเป็นการ เอา Session มาซ้อนกัน แล้วมันจะ งง มาก ๆ และเมื่อเราเข้ามาใน Session แล้วหากเราต้องการ Detach ออกจาก Session ให้เรากด Prefix + D

หากเรา ls ดู เราจะเห็นว่า Session ที่เรา Detach ไป มันก็จะยังคงเปิดอยู่เหมือนเดิม ทำให้ หากเรารันโปรแกรมอะไรเอาไว้ มันก็จะอยู่แบบนั้นแหละ ทำให้เราสามารถเปิด Session อื่น ๆ เพื่อทำงานต่อไปได้นั่นเอง

$ tmux a

ความสนุกมันอยู่ที่ว่า หากเราเปิด Terminal แล้วเปิดขึ้นมาใหม่ แล้วลอง ls ดู เราจะพบว่า Session มันไม่ได้หายไปไหนเลย เพราะแต่ละ Session มันมี Process ของตัวเองที่ถูกควบคุมด้วย tmux-server อีกทีนึง อันนี้รู้ไว้เท่านี้พอแล้ว ซึ่งถ้าเราต้องการ Attach หน้าต่างล่าสุดแบบเร็ว ๆ เราสามารถใช้คำสั่งด้านบนได้เลย

นายเองก็ดูเทพได้นะ ด้วย tmux น่ะ

ในแต่ละ Session เราสามารถใส่ได้หลาย Window พร้อม ๆ กัน เราสามารถสร้าง Window ใหม่ได้โดยการกด Prefix + c เมื่อเรากด เราจะเห็นว่า เราจะได้หน้า Terminal ใหม่ ให้เราสังเกตที่ด้านล่างซ้ายเหมือนเดิม จากเดิมมันมีเลข 0 แล้วตามด้วย Shell ตอนนี้มันมีเลข 1 โผล่ขึ้นมาแล้ว มันคือ Window ที่เราเปิดทิ้งไว้อยู่ คล้าย ๆ กับการเปิด Tab ใหม่ใน Web Browser เลย

โดยเราสามารถขอดูได้ว่าใน Session เราเปิด Windows ไหนไว้บ้าง ด้วยการกด Prefix + w จากนั้นเราอยากไป Windows ไหนของ Session ไหน เราแค่เอาลูกศรเลื่อน ๆ แล้วกด Enter มันก็จะไปที่หน้าต่างนั้นเลย แต่วิธีนี้มันช้า มันดูเด็ก ๆ ไป เรามันระดับผู้ใหญ่แล้ว เราจะกด Prefix + n เพื่อเลื่อนไปยัง Window ถัดไป และ Prefix + p สำหรับย้อนกลับไป Window ก่อนหน้า

แต่ถ้าเรามีหน้าต่างเยอะ ๆ การจะ Next ไปเรื่อย ๆ โหว มันดูไก่อ่อนไปหน่อย เราสามารถตั้งชื่อ Window เพื่อ Navigate ไปหาได้แบบเร็วได้ ๆ ด้วยการกด Prefix + , แล้วตั้งชื่อแล้วกด Enter เช่นเราตั้งชื่อหน้าต่างนี้ว่า main เราจะเห็นว่าจากเดิมมันเป็น zsh มันก็จะเปลี่ยนเป็น main ให้เรา

จากนั้น หากเราต้องการไปที่หน้าต่างที่เราตั้งชื่อไว้ เราสามารถกด Prefix + f แล้วพิมพ์ชื่อเข้าไป มันจะเป็นการค้นหาหน้าต่าง หากเราพิมพ์ชื่อเป๊ะ ๆ เราก็สามารถกด Enter ได้แบบเร็ว ๆ

นายเองก็ดูเทพได้นะ ด้วย tmux น่ะ

ตัวอย่างของการทำงานหลาย ๆ Window แบบง่าย ๆ คือ ใน 1 Project ของเราอาจจะมีหลาย ๆ Source Code ย่อย ๆ เช่นมี Frontend และ Backend Project เราก็สามารถแบ่ง Window ตัวนึงของ Frontend และอีกตัวของ Backend พร้อมกับตั้งชื่อเพื่อความง่ายในการดูที่ด้านล่างซ้ายด้วย

มาถึงจุดที่เท่กว่าเดิม เหมือนในหนัง Sci-Fi ละ คือการจัดการกับ Pane คือ ใน 1 Window เราสามารถใส่ได้หลาย ๆ Pane พร้อม ๆ กัน ตัวอย่างเช่นใน Frontend Project เราจะต้องรัน Web Server ขึ้นมาอันนึง กับมีอีกอันเพื่อไว้สั่งสร้าง หรือจัดการไฟล์ต่าง ๆ ใน Frontend เอง เราก็จะสร้าง Pane 2 ตัวมาเพื่อจัดการตรงนี้แหละ

นายเองก็ดูเทพได้นะ ด้วย tmux น่ะ

เราสามารถกดสร้าง Pane ได้โดยการกด Prefix + % หน้าต่างมันก็จะแยกออกมาเป็นซ้ายขวาอย่างที่เห็นในรูปเลย และเราสามารถสลับการทำงานระหว่าง Pane ได้การกด Prefix + ลูกศร เช่น เราอยู่ซ้าย เราจะไปขวา เราก็กด Prefix + ลูกศรขวา บอกเลยว่า ถ้ากด เร็ว ๆ มันจะทำให้เราดูเทพมาก ๆ เลยแหละ

และเรายังสามารถสลับรูปแบบของการจัดเรียงในขนาดที่เท่า ๆ กันได้โดยการกด Prefix + Space จากตัวอย่าง จะเห็นว่า พอเรามี 3 Pane มันก็จะจัดเรียงให้แต่ละ Pane เท่ากันหมดเลย และเมื่อเรากด Prefix + Space ไปเรื่อย ๆ มันก็จะเปลี่ยน Layout ไปเรื่อย ๆ

แต่ถ้าเราต้องการลดความเท่แบบหนัง Hacker ไก่อ่อน เราสามารถใช้ Mouse ได้ด้วยนะ แต่เราจะต้องเปิดการใช้งานมันก่อนด้วย Prefix + :set mouse เราก็จะสามารถเอา Mouse ไปคลิกที่ Pane มันก็จะสลับไปที่ Pane นั้นให้เราเลย วิธีนี้เราใช้เฉพาะกับ OS ที่มี Mouse Support เท่านั้นนะ เราแนะนำว่า อย่าใช้เลย พยายามใช้ Keyboard อย่างเดียวดีกว่า เพราะส่วนใหญ่ เราคิดว่า คนที่ต้องใช้ tmux จริง ๆ เขาน่าจะทำงานกับ OS ที่เป็น Command Line ล้วน ๆ เช่น Ubuntu Server

อีกความเท่ ที่ทำทีไร ทุกคนช๊อคมากคือ เราสามารถ Sync Pane กันได้ เช่น เราพิมพ์อะไร มันจะโผล่ไปในทุก Pane เลย เช่น เรา SSH เข้าไปที่ Server อยู่ 3 Pane แล้วเราต้องการรันโปรแกรมเหมือนกัน เราก็สามารถกด Prefix + :set syncronize-panes กด Enter จากนั้นเราพิมพ์อะไร มันจะพิมพ์เหมือนกันในทุก Pane เลย โคตรเท่ Like a hacker ปะละ

สรุป : จะเท่ได้ นายต้องใช้บ่อย ๆ ถึงจะคล่อง

ถ้าใครได้อ่านมาถึงตรงนี้ แล้วได้ลองทำแบบที่เราบอกดู จะรู้สึกว่า เห้ยการกด Control + B แล้วตามด้วย Shortcut มันจะทำให้เราทำงานได้เร็วแบบพระเจ้าได้อย่างไร เอาจริง ๆ ถ้าไม่เก่งเท่าเราก็ทำไม่ได้หรอกนะครับ ฮั่นแน่ ตรีนทาบจอแล้วอะเด้ ล้อเล่นนะ เอาจริง ๆ คือ เราคิดว่า มันจะต้องใช้งานบ่อย ๆ และเดี๋ยวมันจะค่อย ๆ เร็วขึ้นเอง กับบางคน อาจจะมีการเปลี่ยน Prefix จาก Control + B เป็นตัวอื่นที่ถนัดมากกว่า ก็แล้วแต่เราเลยว่า เราชอบแบบไหน การเล่นกับ Terminal เราว่ามันสนุกตรงนี้แหละ เราสามารถ Config วิธีการทำงานได้ตามแบบที่เราต้องการ

ถามว่า แล้วประโยชน์ของ tmux คืออะไร (นอกจากความเท่ อะนะ) คือ มันทำให้เราสามารถเปิด Terminal หลาย ๆ หน้าต่างได้ เราอาจจะบอกว่า เอ้า แล้วมันจะต่างจากการเปิด Terminal อันใหม่ในเครื่องของเราอย่างไรละ คือต้องเข้าใจก่อนนะว่า tmux มันถูกสร้างขึ้นมาสำหรับ OS ที่เป็น Command Line เพียว ๆ เลยยังไงละ หากเราต้องไปใช้ OS แบบนั้น มันก็จะทำให้เราทำงานได้เร็วขึ้น ตัวอย่างเช่นเราเอง ส่วนใหญ่ เราทำงานอยู่บน HPC และ Cluster ต่าง ๆ บางทีเราก็จะ SSH เข้าไปแก้ Source Code บนนั้น และสั่งรัน แต่ถ้าเราต้องมานั่งเปิด Terminal หลาย ๆ หน้าต่างแล้วต้อง SSH เข้าไปทุกหน้าต่างมันก็ไม่ไหวเหมือนกัน tmux มันเข้ามาช่วยเราได้เยอะมากเลยทีเดียว

Read Next...

นายเองก็ดูเทพได้นะ ด้วย tmux น่ะ

นายเองก็ดูเทพได้นะ ด้วย tmux น่ะ

เมื่อหลายวันก่อน เราไปทำงานแล้วใช้ Terminal แบบปีศาจมาก ๆ จนเพื่อนถามว่า เราทำยังไงถึงสามารถสลับ Terminal Session ไปมาได้แบบบ้าคลั่งขนาดนั้น เบื้องหลังของผมน่ะเหรอกัปตัน ผมใช้ tmux ยังไงละ วันนี้เราจะมาแชร์ให้อ่านกันว่า มันเอามาใช้งานจริงได้อย่างไร เป็น Beginner Guide สำหรับคนที่อยากลองละกัน...

ปกป้อง Ubuntu ผ่าน Firewall แบบง่าย ๆ ด้วย UFW

ปกป้อง Ubuntu ผ่าน Firewall แบบง่าย ๆ ด้วย UFW

Firewall ถือว่าเป็นเครื่องมือในการป้องกันภัยขั้นพื้นฐานที่ปัจจุบันใคร ๆ ก็ติดตั้งใช้งานกันอยู่แล้ว แต่หากเรากำลังใช้ Ubuntu อยู่ จริง ๆ แล้วเขามี Firewall มาให้เราใช้งานได้เลยนะ มันชื่อว่า UFW วันนี้เราจะมาทำความรู้จัก และทดลองตั้ง Rule สำหรับการดักจับการเชื่อมต่อที่ไม่เกี่ยวข้องกันดีกว่า...

จัดการเรื่องแต่ละมื้อ แต่ละเดย์ด้วย Obsidian

จัดการเรื่องแต่ละมื้อ แต่ละเดย์ด้วย Obsidian

Obsidian เป็นโปรแกรมสำหรับการจด Note ที่เรียกว่า สารพัดประโยชน์มาก ๆ เราสามารถเอามาทำอะไรได้เยอะมาก ๆ หนึ่งในสิ่งที่เราเอามาทำคือ นำมาใช้เป็นระบบสำหรับการจัดการ Todo List ในแต่ละวันของเรา ทำอะไรบ้าง วันนี้เราจะมาเล่าให้อ่านกันว่า เราจัดการะบบอย่างไร...

Loop แท้ไม่มีอยู่จริง มีแต่ความจริงซึ่งคนโง่ยอมรับไม่ได้

Loop แท้ไม่มีอยู่จริง มีแต่ความจริงซึ่งคนโง่ยอมรับไม่ได้

อะ อะจ๊ะเอ๋ตัวเอง เป็นยังไงบ้างละ เมื่อหลายเดือนก่อน เราไปเล่าเรื่องกันขำ ๆ ว่า ๆ จริง ๆ แล้วพวก Loop ที่เราใช้เขียนโปรแกรมกันอยู่ มันไม่มีอยู่จริง สิ่งที่เราใช้งานกันมันพยายาม Abstract บางอย่างออกไป วันนี้เราจะมาถอดการทำงานของ Loop จริง ๆ กันว่า มันทำงานอย่างไรกันแน่ ผ่านภาษา Assembly...