Ssh पर कई मशीनों पर पूंछ लॉग फ़ाइल


36

मैं tailकई दूरस्थ मशीनों पर एक लॉग फ़ाइल की कोशिश कर रहा हूँ और अपने स्थानीय कार्य केंद्र को आउटपुट अग्रेषित कर रहा हूँ । मैं दबाते समय कनेक्शन बंद करना चाहता हूं Ctrl- C

फिलहाल मेरा निम्नलिखित कार्य है जो लगभग इरादा के अनुसार काम करता है।

function dogfight_tail() {
 logfile=/var/log/server.log
 pids=""
 for box in 02 03; do
   ssh server-$box tail -f $logfile | grep $1 &
   pids="$pids $!"
 done
 trap 'kill -9 $pids' SIGINT
 trap  wait
}

कनेक्शन बंद है और मैं से उत्पादन प्राप्त करते हैं tail। लेकिन, कुछ प्रकार की बफरिंग चल रही है क्योंकि आउटपुट बैचों में आते हैं।

और यहाँ मजेदार हिस्सा है ...

मैं एक ही बफरिंग व्यवहार को देख सकता हूं जब /var/log/server.log4-5 बार दूरस्थ मशीनों पर फ़ाइल में निम्नलिखित और परिशिष्ट "निष्पादित" किया जाता है ...

ssh server-01 "tail -f /var/log/server.log | grep test"

... और इसे अक्षम करने के दो तरीके पाए गए ...

  1. Add -t flag to ssh।

    ssh -t server-01 "tail -f /var/log/server.log | grep test"
  2. रिमोट कमांड से कोटेशन निकालें।

    ssh server-01 tail -f /var/log/server.log | grep test

हालाँकि, इनमें से कोई भी फ़ंक्शन उस फ़ंक्शन के लिए काम नहीं करता है जो ऊपर उल्लिखित कई मशीनों पर निष्पादित होता है।

मैंने dsh की कोशिश की है, जिसे निष्पादित करते समय एक ही बफरिंग व्यवहार होता है।

dsh -m server-01,server-02 -c "tail -f /var/log/server.log | grep test"

यहां भी, यदि मैं उद्धरण हटाता हूं, तो बफ़रिंग चली जाती है और सब कुछ ठीक रहता है।

dsh -m server-01,server-02 -c tail -f /var/log/server.log | grep test

यह भी कोशिश की parallel-sshजो ठीक उसी तरह काम करता है dsh। क्या कोई समझा सकता है कि यहाँ क्या चल रहा है?

मैं इस समस्या को कैसे हल करूं? sshयदि संभव हो तो सीधे जाने के लिए आदर्श होगा ।

पुनश्च मैं उपयोग नहीं करना चाहता multitailया इसी तरह से जब से मैं मनमाना आदेशों को निष्पादित करने में सक्षम होना चाहता हूं।


आप यहांdbitail से चेकआउट और डाउनलोड कर सकते हैं

जवाबों:


36

आप जो देखते हैं वह grepग्लिब्क द्वारा प्रदान किए गए मानक स्टडआउट बफर का प्रभाव है । सबसे अच्छा समाधान यह है कि इसे --line-buffered(GNU grep) का उपयोग करके इसे निष्क्रिय कर दिया जाए , मुझे यकीन नहीं है कि अन्य कार्यान्वयन इसे या कुछ इसी तरह का समर्थन कर सकते हैं)।

के रूप में क्यों यह केवल कुछ मामलों में होता है:

ssh server "tail -f /var/log/server.log | grep test"

सर्वर पर उद्धरण में पूरे कमांड चलाता है - इस प्रकार grepइसके बफर को भरने के लिए इंतजार करता है।

ssh server tail -f /var/log/server.log | grep test

ssh चैनल के माध्यम से भेजे grepगए आउटपुट पर आपकी स्थानीय मशीन पर चलता है tail

यहाँ महत्वपूर्ण हिस्सा यह है कि grepयह उसके stdinटर्मिनल या नहीं के आधार पर उसके व्यवहार को समायोजित करता है। जब आप चलते हैं ssh -t, तो रिमोट कमांड एक कंट्रोलिंग टर्मिनल के साथ चल रहा है और इस grepतरह रिमोट आपके स्थानीय की तरह व्यवहार करता है।


विस्तृत विवरण के लिए बहुत बहुत धन्यवाद। यह अब मेरे लिए समझ में आता है और स्क्रिप्ट - के रूप में अपेक्षित के साथ काम करता है - बफर।
डीएसएच

@deephacks उस मामले में कृपया जवाब स्वीकार करने पर विचार करें - यह दूसरों को एक ही समस्या होने का सुराग देता है।
पेट्रोफ

1
grep / glibc की बफरिंग इसके स्टडआउट पर निर्भर करती है । ssh tail | grepस्थानीय टर्मिनल के लिए आउटपुट, असंबद्ध। ssh -t "tail|grep"पैटी के लिए आउटपुट, असंबद्ध। ssh "tail|grep"एक पाइप (को sshd), बफ़र्ड (जब तक --line-buffered) के लिए आउटपुट ।
dave_thompson_085

2

इसकी जांच करें: multitail

मल्टीटेल आपको एक टर्मिनल में कई विंडो में लॉगफ़ाइल्स और कमांड आउटपुट को मॉनिटर करने, कलर करने, फ़िल्टर करने और मर्ज करने की अनुमति देता है।

कई सर्वरों में लॉग का उपयोग करने के लिए:

multitail -l 'ssh user@host1 "tail -f /path/to/log/file"' -l 'ssh user@host2 "tail -f /path/to/log/file"'

3
लेकिन यह आपको ssh पर ऐसा नहीं करने देता, जो इस प्रश्न की एक शर्त है। (और, यह भी, सवाल विशेष रूप से कहता है "मल्टीटैल का उपयोग नहीं करना चाहते हैं"।)
बिशप

1
@ बिशप: मुझे लगता है कि यह आलोचना आंशिक रूप से अनुचित है क्योंकि प्रश्न में मल्टीटैल का उपयोग न करने का उल्लेख किया गया हो सकता है, यह गलतफहमी के कारण लगता है। ऊपर दिए गए उदाहरण से पता चलता है कि मनमाना आदेशों का उपयोग कैसे किया जाता है और नियमित शेल विस्तार भी काम करता है - multitail <(ssh …) <(ssh …)- वांछित परिणाम की अनुमति देना भले ही यह नहीं है कि वे मूल रूप से कैसे सोचते हैं कि प्रश्न का उत्तर दिया जा सकता है।
क्रिस एडम्स

0

आप सहयोगी लॉग में चेकआउट कर सकते हैं।

एक जावा उपकरण जो मैंने बनाया, SSH का उपयोग करके स्थानीय और दूर की लॉग फ़ाइलों को पढ़ने में सक्षम। यह उपयोग करने के लिए काफी सरल है।

कुछ और स्पष्टीकरण: https://github.com/pschweitz/insidelog/wiki

आपके जावा रनटाइम के भीतर मूल जार रिलीज़ निष्पादन योग्य, आपके ऑपरेटिंग सिस्टम के अनुरूप संस्करण डाउनलोड करें (java 8_40 या उच्चतर की आवश्यकता है):

https://github.com/pschweitz/insidelog/releases

आप एक पूर्ण प्रलेखन (जीथब के पेज के साथ और साथ ही) पा सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.