มีคำสั่ง“ log” ของ GNU Screen เทียบเท่าใน tmux หรือไม่?


35

ฉันใช้คำสั่ง "log" ของหน้าจออย่างหนักเพื่อบันทึกผลลัพธ์ของเซสชันไปยังไฟล์เมื่อฉันทำการเปลี่ยนแปลงในสภาพแวดล้อมที่กำหนด ฉันค้นหาผ่านหน้า man ของ tmux แต่ไม่พบสิ่งที่เทียบเท่า ใครรู้คุณสมบัติคล้ายกันใน tmux หรือฉันต้องเขียนสคริปต์เสื้อคลุมของตัวเองเพื่อทำ

แก้ไข: ฉันตระหนักถึง 'สคริปต์' และโปรแกรมอรรถประโยชน์อื่น ๆ ที่อนุญาตให้ฉันเข้าสู่ระบบเซสชั่น เหตุผลที่ฟังก์ชั่นการใช้งานของหน้าจอมีประโยชน์มากคือความสามารถในการกำหนดตัวแปร logfile ซึ่งใช้การยกเว้นสตริงเพื่อระบุแต่ละเซสชันโดยไม่ซ้ำกัน

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

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

คำตอบ:


39

ให้ฉันดูว่าฉันถอดรหัสการตั้งค่าหน้าจอของคุณถูกต้องหรือไม่:

  • คุณใช้สิ่งที่ชอบlogfile "%t-screen.log"(อาจเป็น.screenrcไฟล์) เพื่อกำหนดชื่อของไฟล์บันทึกที่จะเริ่มในภายหลัง
  • คุณใช้คำสั่งหน้าจอtitle <hostname> (Ca A) เพื่อตั้งชื่อเรื่องของหน้าต่างใหม่หรือ คุณทำเพื่อเริ่มเซสชันหน้าจอใหม่
    screen -t <hostname> ssh0 <hostname>
  • คุณใช้คำสั่งหน้าจอ Ca H (Ca: log) เพื่อสลับการบันทึกไปยังไฟล์ที่กำหนดค่า

ถ้าเป็นเช่นนั้นก็เกือบเทียบเท่า (ต้องการtmux 1.3+ เพื่อสนับสนุน #W ในpipe-paneคำสั่งเชลล์; pipe-paneมีให้ในtmux 1.0+):

  • ในไฟล์กำหนดค่า (เช่น.tmux.conf):

    bind-key H pipe-pane -o "exec cat >>$HOME/'#W-tmux.log'"
    
  • ใช้tmux rename-window <hostname>(Cb,) เพื่อเปลี่ยนชื่อหน้าต่างที่มีอยู่หรือ
    ใช้tmux new-window -n <hostname> 'ssh <hostname>'เพื่อเริ่มหน้าต่างtmuxใหม่หรือ
    ใช้tmux new-session -n <hostname> 'ssh <hostname>'เพื่อเริ่มเซสชันtmuxใหม่
  • ใช้ Cb H เพื่อสลับการบันทึก

ไม่มีการแจ้งเตือนว่ามีการสลับบันทึก แต่คุณสามารถเพิ่มได้ถ้าคุณต้องการ:

bind-key H pipe-pane -o "exec cat >>$HOME/'#W-tmux.log'" \; display-message 'Toggled logging to $HOME/#W-tmux.log'

หมายเหตุ: บรรทัดด้านบนจะแสดงราวกับว่าอยู่ในไฟล์กำหนดค่า (อย่างใดอย่าง.tmux.confหนึ่งหรืออย่างใดอย่างหนึ่งของคุณsource) tmuxต้องการเห็นทั้งเครื่องหมายแบ็กสแลชและเครื่องหมายอัฒภาค; หากคุณต้องการกำหนดค่านี้จากเปลือก (เช่นtmux bind-key …) จากนั้นคุณจะต้องหลบหนีหรืออ้างถึงตัวละครทั้งสองอย่างเหมาะสมเพื่อให้พวกเขาจะถูกส่งไปยังtmuxเหมือนเดิม มีไม่ดูเหมือนจะเป็นวิธีที่สะดวกในการแสดงข้อความที่แตกต่างกันสำหรับการสลับการเปิด / ปิดเมื่อใช้เพียงคนเดียวที่มีผลผูกพัน (คุณอาจจะสามารถแท่นขุดเจาะบางสิ่งบางอย่างขึ้นมาด้วยif-shellแต่มันอาจจะเป็นที่น่าเกลียด) หากการผูกสองครั้งเป็นที่ยอมรับได้ให้ลองทำดังนี้:

bind-key H pipe-pane "exec cat >>$HOME/'#W-tmux.log'" \; display-message 'Started logging to $HOME/#W-tmux.log'
bind-key h pipe-pane \; display-message 'Ended logging to $HOME/#W-tmux.log'

ดี! ดูเหมือนว่าจะทำในสิ่งที่ฉันต้องการ
Murali Suriar

Hrrm ดังนั้นการพยายามทำสิ่งนี้จากเปลือกจึงทำให้เกิดปัญหาบางอย่าง ข้อเสนอแนะใด ๆ เกี่ยวกับวิธีการจัดการผ่านสายทั้งหมดไปยัง tmux เหมือนเดิมหรือไม่ "
Murali Suriar

2
@KamilDziedzic: คุณอาจลองใส่tmux pipe-pane …คำสั่งในdefault-command(เช่นก่อนที่จะเริ่มเชลล์); แน่นอนว่าจะใช้งานได้กับบานหน้าต่าง "เริ่มต้น" เท่านั้น (ไม่มีอะไรเริ่มต้นด้วยคำสั่งที่ชัดเจนเช่นnew-window sqlite3) มีการแนะนำว่าเบ็ด“” การสนับสนุนอาจที่ดินในบางรุ่นในอนาคตtmux ; นี้อาจช่วยให้คุณสามารถกำหนดค่าคำสั่ง (เช่นpipe-pane …) ที่จะทำงานโดยอัตโนมัติหลังจากที่คำสั่งอื่น ๆ บางnew-session, new-windowหรือsplit-pane)
Chris Johnsen

1
@sebelk: หากคุณพิจารณาแต่ละบรรทัดว่าเป็น "รายการ" คุณสามารถใช้เชลล์readและdateจัดเรียงได้ เช่นbind-key H pipe-pane -o 'exec bash -c "while IFS= read -r line; do echo \"\$(date +%%Y%%m%%dT%%H%%M%%SZ%%z): \$line\"; done" >>$HOME/"#W-tmux.log"'
Chris Johnsen

1
@ChrisJohnsen ... ที่อาจทำให้ห่างไกลที่มีประสิทธิภาพมากขึ้นถ้าเรารู้ว่าทุบตีเป็น 4.1 หรือใหม่กว่า - วิ่งพล่าน subshell เพื่อเรียกใช้สำเนาสดของdateสำหรับสายของการส่งออกในแต่ละเป็นไปได้การตีอย่างรุนแรง! ดีกว่ามากในการprintf '%(%Y%m%dT%H%M%S)T: %s\n' "$line"(หนีตามความจำเป็นสำหรับการรวมอยู่ในไฟล์ tmux config ดังนั้นจึงน่าจะเป็นสองเท่า%sและหลบหนี"s)
ชาร์ลส์ดัฟฟี่

5

นี่เป็น tmux ปลั๊กอินที่ช่วยให้การเข้าสู่ระบบโดยไม่ต้องยุ่งกับการผูกสำคัญใน.tmux.conf:

https://github.com/tmux-plugins/tmux-logging

คุณสมบัติ:

  • prefix + Pสลับการบันทึกบานหน้าต่าง เอาต์พุตถูกลบออกจากอักขระ ANSI ที่ไม่ต้องการ!
  • prefix + Alt + P บันทึกประวัติบานหน้าต่างที่สมบูรณ์ไปยังไฟล์

4

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

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


1
นั่นคือข้อสรุปของฉันเช่นกัน ฉันตัดสินใจที่จะติดกับหน้าจอตอนนี้ซึ่งเป็นความอัปยศเช่นเดียวกับนอกเหนือจากการกำกับดูแลนี้ tmux ดูเหมือนดีมาก
Murali Suriar

1

ฉันทำโดยใช้สคริปต์นี้มาจากไฟล์ tmux.conf ของฉัน

bind ^C new-window "script -f /home/jcosta/mydocs/work/logs/$(date '+%d%m%Y_%H%M%S')_$$.log"
bind c new-window "script -f /home/jcosta/mydocs/work/logs/$( date '+%d%m%Y_%H%M%S')_$$.log"
bind | split-window "script -f /home/jcosta/mydocs/work/logs/$(date '+%d%m%Y_%H%M%S')_$$.log"

1
การแทนที่logคำสั่งของหน้าจอที่ไม่ดีซึ่งช่วยให้สามารถเข้าสู่ระบบได้ทันที แต่ถ้าคุณอยู่ใน tmux และต้องการใช้การบันทึกของหน้าจอคุณต้องเริ่มเชลล์ใหม่อย่างไรก็ตาม
Arcege
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.