क्या GNU स्क्रीन के "लॉग" कमांड का tmux में समतुल्य है?


35

जब मैं किसी दिए गए वातावरण में परिवर्तन कर रहा होता हूं, तो मैं सत्र के आउटपुट को लॉग करने के लिए स्क्रीन के "लॉग" कमांड का भारी उपयोग करता हूं। मैंने tmux के मैन पेज के माध्यम से खोज की, लेकिन एक समकक्ष नहीं मिला। क्या किसी को tmux में इसी तरह की सुविधा के बारे में पता है, या क्या मुझे ऐसा करने के लिए अपनी स्वयं की आवरण लिपियों को लिखना होगा?

संपादित करें: मुझे 'स्क्रिप्ट' और अन्य उपयोगिताओं के बारे में पता है जो मुझे एक सत्र में प्रवेश करने की अनुमति देते हैं। कारण यह है कि स्क्रीन की कार्यक्षमता इतनी उपयोगी है कि लॉगफ़ाइल चर को परिभाषित करने की क्षमता है जो प्रत्येक सत्र को विशिष्ट रूप से पहचानने के लिए स्ट्रिंग एस्केप का उपयोग करता है।

उदाहरण के लिए, मेरे पास एक शेल फ़ंक्शन है, जो एक होस्टनाम दिया गया है, उस होस्ट को एक नई स्क्रीन विंडो में एसएसएच करेगा और विंडो का शीर्षक होस्टनाम पर सेट करेगा। जब मैं उस सत्र का लॉग शुरू करता हूं, तो यह विंडो शीर्षक के साथ उपसर्ग होता है।

यदि यह कार्यक्षमता tmux में मौजूद नहीं है, तो मुझे सत्रों की 'स्क्रिप्ट' सेट करने के लिए शेल फ़ंक्शन का एक नया सेट बनाना होगा, जिसे मैं लॉग इन करना चाहता हूं। यह बहुत मुश्किल नहीं है, लेकिन यह उस प्रयास के लायक नहीं हो सकता है जब स्क्रीन ठीक वैसा ही हो जैसा मुझे पहले से ही चाहिए था।

जवाबों:


39

मुझे देखने दें कि क्या मैंने आपके स्क्रीन कॉन्फ़िगरेशन को सही ढंग से परिभाषित किया है:

  • आप लॉग फ़ाइल के नाम को कॉन्फ़िगर करने के लिए कुछ logfile "%t-screen.log"(शायद एक .screenrcफ़ाइल में) का उपयोग करते हैं जिसे बाद में शुरू किया जाएगा।
  • आप एक नई विंडो का शीर्षक सेट करने के लिए title <hostname>(Ca A) स्क्रीन कमांड का उपयोग करते हैं, या
    आप screen -t <hostname> ssh0 <hostname>एक नया स्क्रीन सत्र शुरू करने के लिए करते हैं ।
  • आप कॉन्फ़िगर फ़ाइल में लॉगिंग टॉगल करने के लिए Ca H (Ca: log) स्क्रीन कमांड का उपयोग करते हैं।

यदि ऐसा है, तो लगभग समतुल्य है ( शेल कमांड में #W का समर्थन करने के लिए tmux 1.3+ की आवश्यकता है pipe-pane; pipe-paneयह tmux ++ में उपलब्ध है :

  • कॉन्फ़िगरेशन फ़ाइल (उदा .tmux.conf) में:

    bind-key H pipe-pane -o "exec cat >>$HOME/'#W-tmux.log'"
    
  • का प्रयोग करें tmux rename-window <hostname>(सीबी,) एक मौजूदा विंडो का नाम बदलने के लिए, या करने के लिए
    उपयोग करने 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'

अच्छा! कि मैं क्या जरूरत है बहुत ज्यादा करने के लिए लग रहा है।
मुरली सुरियार

Hrrm। इसलिए शेल से ऐसा करने का प्रयास कुछ मुद्दों को जन्म देता है। किसी भी सुझाव के रूप में कैसे पूरी लाइन को tmux बरकरार रखने के लिए पारित करने के लिए प्रबंधन? "
मुरली सुरियार

2
@KamilDziedzic: आप tmux pipe-pane …अपने में एक कमांड default-command(यानी शेल शुरू करने से पहले) सहित कोशिश कर सकते हैं ; बेशक जो केवल "डिफ़ॉल्ट" पैन के लिए काम करेगा (कुछ भी स्पष्ट कमांड के साथ शुरू नहीं हुआ, उदाहरण के लिए new-window sqlite3)। वहाँ संकेत किया गया है कि "हुक" के कुछ भविष्य संस्करण में समर्थन हो सकता है भूमि tmux ; यह आप एक आदेश कॉन्फ़िगर कर सकते हैं हो सकता है (उदाहरण के लिए pipe-pane …) स्वचालित रूप से कुछ अन्य आदेश के बाद चलाने के लिए new-session, new-windowया split-pane)।
क्रिस जॉन्सन

1
@ अविश्वास: यदि आप एक व्यक्तिगत लाइन को "प्रविष्टि" मानते हैं तो आप एक शेल का उपयोग कर सकते हैं 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"'
क्रिस जॉन्सन

1
@ChrisJohnsen, ... अगर हम बाॅस को जानते थे तो यह कहीं अधिक कुशल हो सकता था। 4.1 या नया - 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 के लिए दस्तावेज़ीकरण देखने के बाद, मुझे स्क्रीन के विंडो लॉगिंग के बराबर नहीं मिल सकता है। ऐसा लगता है कि आपको अपने शेल फ़ंक्शंस का उपयोग करना होगा जो आप करना चाहते हैं, या बस स्क्रीन का उपयोग करें। आप डिबगिंग को चालू कर सकते हैं, जो सर्वर और क्लाइंट पक्ष दोनों को लॉग करता है, लेकिन इसमें बहुत अधिक एक्सट्रूमस-संबंधित लॉग भी शामिल हैं, इसलिए यह बिल्कुल वैसा नहीं होगा जैसा आप पूछ रहे हैं।

आप संभवतः बफर के क्लिपबोर्ड का उपयोग बफर को दूसरे सत्र में स्वचालित करने के लिए कर सकते हैं, जिसे क्लिपबोर्ड की सामग्री को स्वीकार करने और एक फ़ाइल में सहेजने के लिए स्थापित किया जाएगा। यह एक प्रकार का हैकिश लगता है।


1
यही मेरा निष्कर्ष भी था। मैंने अभी के लिए स्क्रीन के साथ छड़ी करने का फैसला किया है, जो शर्म की बात है, क्योंकि इस निरीक्षण के अलावा, tmux बहुत अच्छा लगता है।
मुरली सूरिहर

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 में हैं और स्क्रीन की लॉगिंग का उपयोग करना चाहते हैं, तो आपको वैसे भी एक नया शेल शुरू करना होगा।
मारस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.