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. 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(জিএনইউ গ্রেপ, আমি নিশ্চিত নই যে অন্যান্য বাস্তবায়নগুলি এটির সমর্থন করতে পারে বা এর অনুরূপ কিছু)।

হিসাবে কেন এই মাত্র কিছু ক্ষেত্রে ঘটবে:

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আপনার স্থানীয়টির মতো আচরণ করে।


বিস্তারিত ব্যাখ্যার জন্য অনেক ধন্যবাদ। এটি এখন আমার কাছে বোধগম্য এবং স্ক্রিপ্টটি - লাইন-বাফার সহ প্রত্যাশা অনুযায়ী কাজ করে।
গভীরীক্ষণ

@ ডিডিফ্যাকস সেই ক্ষেত্রে দয়া করে উত্তরটি গ্রহণ করার বিষয়টি বিবেচনা করুন - এটি অন্যদের একই সমস্যা থাকার জন্য একটি সূত্র দেয়।
পিটার্ফ

1
, grep / জন্য glibc এর বাফারিং তার উপর নির্ভর করে stdout- এssh tail | grepস্থানীয় টার্মিনাল আউটপুট, unfuffered। ssh -t "tail|grep"একটি pty, unfuffered আউটপুট। 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
তবে এটি আপনাকে এসএসএসের মাধ্যমে এটি করতে দেয় না, যা এই প্রশ্নের শর্ত। (এবং, এছাড়াও, প্রশ্নটি বিশেষত "মাল্টিটেল ব্যবহার করতে চাই না" বলে উল্লেখ করে))
বিশপ

1
@ বিশপ: আমি মনে করি এই সমালোচনাটি কিছু অংশে অন্যায়, কারণ প্রশ্নটি মাল্টিটেল ব্যবহার না করার বিষয়টি নির্দিষ্ট করে থাকতে পারে, তবে এটি একটি ভুল বোঝাবুঝির কারণে বলে মনে হচ্ছে। উপরের উদাহরণটি দেখায় যে কীভাবে স্বেচ্ছাচারিত কমান্ডগুলি ব্যবহার করা যায় এবং নিয়মিত শেল বিস্তৃতিও কাজ করে - multitail <(ssh …) <(ssh …)- পছন্দসই ফলাফলের অনুমতি দিলেও যদি তারা মূলত ভেবেছিল যে প্রশ্নের উত্তর দেওয়া যেতে পারে।
ক্রিস অ্যাডামস

0

আপনি সাইড লগ চেকআউট করতে পারেন।

আমি তৈরি একটি জাভা সরঞ্জাম, এসএসএইচ ব্যবহার করে স্থানীয় এবং দূরবর্তী লগ ফাইলগুলি পড়তে সক্ষম। এটি ব্যবহার করা মোটামুটি সহজ।

আরও কিছু ব্যাখ্যা: https://github.com/pschweitz/insidelog/wiki

আপনার জাভা রানটাইম-এর মধ্যে এক্সিকিউটেবল নেটিভ জার রিলিজের কেবল আপনার অপারেটিং সিস্টেমের সাথে সম্পর্কিত সংস্করণটি ডাউনলোড করুন (জাভা 8_40 বা তার বেশি প্রয়োজন):

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

আপনি একটি সম্পূর্ণ ডকুমেন্টেশন (গিথুবের পৃষ্ঠায় এবং এর সাথে এম্বেড থাকা) পেতে পারেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.