By Arnon Puitrakul - 06 มกราคม 2025
เมื่อหลายวันก่อน เราไปทำงานแล้วใช้ Terminal แบบปีศาจมาก ๆ จนเพื่อนถามว่า เราทำยังไงถึงสามารถสลับ Terminal Session ไปมาได้แบบบ้าคลั่งขนาดนั้น เบื้องหลังของผมน่ะเหรอกัปตัน ผมใช้ tmux ยังไงละ วันนี้เราจะมาแชร์ให้อ่านกันว่า มันเอามาใช้งานจริงได้อย่างไร เป็น Beginner Guide สำหรับคนที่อยากลองละกัน
// 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 ตัวพิมพ์ใหญ่นะ
ก่อนเราจะไปลองใช้งานกัน เราอยากจะต้องมาทำความเข้าใจหลักการทำงานพื้นฐานกันก่อน โดยการใช้ 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
เมื่อเราเข้ามา ให้เราสังเกตด้านล่างซ้ายมือ มันจะมีเขียนชื่อ 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 หน้าต่างล่าสุดแบบเร็ว ๆ เราสามารถใช้คำสั่งด้านบนได้เลย
ในแต่ละ 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 ได้แบบเร็ว ๆ
ตัวอย่างของการทำงานหลาย ๆ Window แบบง่าย ๆ คือ ใน 1 Project ของเราอาจจะมีหลาย ๆ Source Code ย่อย ๆ เช่นมี Frontend และ Backend Project เราก็สามารถแบ่ง Window ตัวนึงของ Frontend และอีกตัวของ Backend พร้อมกับตั้งชื่อเพื่อความง่ายในการดูที่ด้านล่างซ้ายด้วย
มาถึงจุดที่เท่กว่าเดิม เหมือนในหนัง Sci-Fi ละ คือการจัดการกับ Pane คือ ใน 1 Window เราสามารถใส่ได้หลาย ๆ Pane พร้อม ๆ กัน ตัวอย่างเช่นใน Frontend Project เราจะต้องรัน Web Server ขึ้นมาอันนึง กับมีอีกอันเพื่อไว้สั่งสร้าง หรือจัดการไฟล์ต่าง ๆ ใน Frontend เอง เราก็จะสร้าง Pane 2 ตัวมาเพื่อจัดการตรงนี้แหละ
เราสามารถกดสร้าง 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 มันเข้ามาช่วยเราได้เยอะมากเลยทีเดียว
เมื่อหลายวันก่อน เราไปทำงานแล้วใช้ Terminal แบบปีศาจมาก ๆ จนเพื่อนถามว่า เราทำยังไงถึงสามารถสลับ Terminal Session ไปมาได้แบบบ้าคลั่งขนาดนั้น เบื้องหลังของผมน่ะเหรอกัปตัน ผมใช้ tmux ยังไงละ วันนี้เราจะมาแชร์ให้อ่านกันว่า มันเอามาใช้งานจริงได้อย่างไร เป็น Beginner Guide สำหรับคนที่อยากลองละกัน...
Firewall ถือว่าเป็นเครื่องมือในการป้องกันภัยขั้นพื้นฐานที่ปัจจุบันใคร ๆ ก็ติดตั้งใช้งานกันอยู่แล้ว แต่หากเรากำลังใช้ Ubuntu อยู่ จริง ๆ แล้วเขามี Firewall มาให้เราใช้งานได้เลยนะ มันชื่อว่า UFW วันนี้เราจะมาทำความรู้จัก และทดลองตั้ง Rule สำหรับการดักจับการเชื่อมต่อที่ไม่เกี่ยวข้องกันดีกว่า...
Obsidian เป็นโปรแกรมสำหรับการจด Note ที่เรียกว่า สารพัดประโยชน์มาก ๆ เราสามารถเอามาทำอะไรได้เยอะมาก ๆ หนึ่งในสิ่งที่เราเอามาทำคือ นำมาใช้เป็นระบบสำหรับการจัดการ Todo List ในแต่ละวันของเรา ทำอะไรบ้าง วันนี้เราจะมาเล่าให้อ่านกันว่า เราจัดการะบบอย่างไร...
อะ อะจ๊ะเอ๋ตัวเอง เป็นยังไงบ้างละ เมื่อหลายเดือนก่อน เราไปเล่าเรื่องกันขำ ๆ ว่า ๆ จริง ๆ แล้วพวก Loop ที่เราใช้เขียนโปรแกรมกันอยู่ มันไม่มีอยู่จริง สิ่งที่เราใช้งานกันมันพยายาม Abstract บางอย่างออกไป วันนี้เราจะมาถอดการทำงานของ Loop จริง ๆ กันว่า มันทำงานอย่างไรกันแน่ ผ่านภาษา Assembly...