screen

เอามาจาก ThaiLinuxCafe - bash tips

จิ๊กมาจากบล๊อกคุณพูลลาภเรื่อง คุณเปิด terminal กี่บาน? ท่านเขียนไว้ดีมาก ๆ

screen เป็น virtual terminal มีประโยชน์มากในการใช้งานผ่าน ssh ข้อดีคือเวลาเรากลับเข้าไปในงานที่ทำค้างอยู่ มันจะเห็นเหมือนกับเราทำที่จุดนั้นจริง ๆ สมมุติเราคอมไพล์งานค้างไว้ ถ้ามีข้อผิดพลาด มันจะแสดงให้เห็นข้อผิดพลาดนั้นด้วย ที่สำคัญคือมันเป็น text mode จึงทำงานเร็วและไม่เปลืองแบนด์วิดท์

สั่งเริ่ม screen

$ screen

คีย์ลัดที่ใช้บ่อย

  • C-a c = สร้างเชลล์ใหม่
  • C-a n = ไปเทอร์มินัลถัดไป ( ที่ยัง attach อยู่ )
  • C-a p = ไปเทอร์มินัลก่อนหน้า ( ที่ยัง attach อยู่ )
  • C-a d = detach เชลล์ปัจจุบัน ( กลับมาด้วยคำสั่ง screen -r )
  • C-a " = ดูเทอร์มินัลทั้งหมด ( คล้ายคำสั่ง screen -ls )
  • C-a 0 = ไปเทอร์มินัล 0
  • C-a 1 = ไปเทอร์มินัล 1
  • C-a S = แบ่งเทอร์มินัลแบบแนวตั้ง

(*หมายเหตุ C-a คือกด Ctrl+a )

ดูเชลล์ที่มี

$ screen -ls

ไป attach เชลล์ที่ถูก detach

ถ้ามีแค่เชลล์เดียว

$ screen -r

ถ้ามีหลายเชลล์

$ screen -r [pid.]tty[.host]

ปรับแต่งลักษณะของ screen ด้วยไฟล์ ~/.screenrc

$ vi ~/.screenrc
# ไม่เอาข้อความต้อนรับ
startup_message off

# ตั้งค่า scroll มากกว่าค่าปริยาย (100)
defscrollback 1024

# ทำให้มีแถบ status ด้านล่าง
hardstatus on
hardstatus alwayslastline
hardstatus string "%{.bW}%-w%{.rW}%n %t%{-}%+w %=%{..G} %H %{..Y} %m/%d %C%a "

# ใช้ Ctrl+t แทน Ctrl+a
escape ^Ta

ดูเพิ่มเติมได้ที่ gentoo-wiki: TIP Using screen ถ้าใช้แล้วติดใจ อยากเวียนหัวเพิ่ม ให้ดู man screen

ตัวอย่างการใช้งาน

สมมุติว่าต้องการแก้ธีมของ drupal ที่เครื่อง server1.example.com เราติดตั้ง drupal ไว้ที่ /var/www/drupal สมมุติว่าเป็นธีม newsportal ไฟล์ที่ต้องการแก้ไขหลัก ๆ จะมีสองไฟล์ คือ style.css และ page.tpl.php อยู่ใน /var/www/drupal/themes/newsportal/

เราจะเข้าถึง server1 ด้วยการใช้ ssh ปกติ

$ ssh server1.example.com -l webmaster

สั่งรัน screen

$ screen

กด space bar ตามปกติ

ตอนนี้เราจะอยู่ในเทอร์มินัล 0 แต่ผมนิยมเว้นเทอร์มินัล 0 ไว้สำหรับงานจิปาถะชั่วคราว และใช้เทอร์มินัล 1 ในการแก้ไขไฟล์ style.css และใช้เทอร์มินัล 2 ในการแก้ไฟล์ page.tpl.php

กด C-a c เพื่อสร้างเทอร์มินัล 1

$ cd /var/www/drupal/themes/newsflash
$ vi style.css

กด C-a c เพื่อสร้างเทอร์มินัล 2

$ cd /var/www/drupal/themes/newsflash
$ vi page.tpl.php

หลังจากนี้เราสามารถสลับงานไปมาด้วยการกด C-a สองครั้ง มันจะสลับไปมาระหว่างเทอร์มินัล 1 และ 2

ถ้าเราปิด ssh โดยไม่ออกจาก screen เมื่อเข้ามาใหม่ เราสามารถเข้ามาที่งานที่ทำค้างไว้ได้เลย ด้วยคำสั่ง screen -r

หรือถ้าเราทำงานค้างไว้ที่ทำงาน และยังเปิด ssh ค้างอยู่ และเรากลับไปต่องานที่บ้าน เราสามารถช่วงชิง screen ที่ยังค้างอยู่ที่ทำงานมาด้วยคำสั่ง screen -d -r

จบแล้วครับ ใครมีทิป screen ดี ๆ แบ่งกันบ้างนะครับ

Comments

ต้องการให้เมื่อเริ่ม screen ทุกครั้ง จะสั่งเปิด 3 หน้าต่างคือแสดง top, syslog, และ dmesg ตามลำดับ โดยตั้งชื่อ session ว่า norm

ใช้การแก้ไขไฟล์ ~/.screenrc ดังนี้

# vi ~/.screenrc
sessionname norm
screen top
screen 1 tail -f /var/log/syslog
screen 2 tail -f /var/log/dmesg

รัน screen

# screen

จะได้ผลตามต้องการ

ต้องการให้ screen เริ่มงานแบบข้างต้น เฉพาะเมื่อเราต้องการ

จะใช้การทำงานผ่านสคริปต์ ดังนี้
สมมุติตั้งชื่อสคริปต์ว่า screen_monitor.sh

# vi screen_monitor.sh
#!/bin/bash
screen -S norm -md bash
screen -S norm -p0 -X stuff "screen bash
"
screen -S norm -p0 -X stuff "top
"
screen -S norm -p1 -X stuff "screen bash
"
screen -S norm -p1 -X stuff "tail -f /var/log/syslog
"
screen -S norm -p2 -X stuff "screen bash
"
screen -S norm -p2 -X stuff "tail -f /var/log/dmesg
"

เปลี่ยนสิทธิ์และสั่งรัน

# chmod 755 screen_monitor.sh
# ./screen_monitor.sh

จะไม่เห็นการเปลี่ยนแปลง เพราะเราสั่งให้ทำงานแบบเบื้องหลัง (-md)

จะเข้าไปสู่ (attach) การทำงานของ screen ได้ด้วยคำสั่ง

# screen -r norm

จบแล้วครับ

หลังจากใช้ Screen มาหลายปี ตอนนี้ผมเปลี่ยนมาใช้ Byobu แล้วครับ ซึ่งมันก็คือ Screen ที่เพิ่ม config เจ๋งๆ เช่น สถานะต่างๆ ของระบบ โดยมันจะแสดงไว้ตรง hardstatus bar ครับ สามารถปรับเปลี่ยนได้ตามความชอบ

สำหรับคนที่อยากใช้คำสั่ง screen แต่อยากได้ profile ของ byobu ก็สามารถระบุ "source ~/.byobu/profile" ไว้ใน ~/.screenrc ได้

Creative Commons License ลิขสิทธิ์ของบทความเป็นของเจ้าของบทความแต่ละชิ้น
ผลงานนี้ ใช้สัญญาอนุญาตของครีเอทีฟคอมมอนส์แบบ แสดงที่มา-อนุญาตแบบเดียวกัน 3.0 ที่ยังไม่ได้ปรับแก้