কেন “লেজু -…… লেজ "কোন আউটপুট উত্পাদন ব্যর্থ?


36

নিম্নলিখিত কমান্ডটি কোনও আউটপুট উত্পাদন করে না কেন?

$ tail -f /etc/passwd | tail

বাফারিং সম্পর্কে পড়ার পরে , আমি নিম্নলিখিতগুলি চেষ্টা করেছিলাম কোনও লাভ হয়নি:

$ tail -f /etc/passwd | stdbuf -oL tail

নোট করুন যে নিম্নলিখিতটি আউটপুট উত্পাদন করে:

$ tail /etc/passwd | tail

সুতরাং এটি করে:

$ tail -f /etc/passwd | head

আমি লেজ সংস্করণ 8.21 (জিএনইউ কোর্টিল) ব্যবহার করছি।


17
Π এর শেষ 10 অঙ্কগুলি কী?
কিথ থম্পসন

উত্তর:


15

আমি ভেবেছিলাম ইউএনআইএক্স-এ সমস্ত কিছু দেখেছি। এই প্রশ্নটি আমাকে আমার স্মাগনেস থেকে সরিয়ে দিয়েছে। কি দুর্দান্ত প্রশ্ন!

tailশেষ এক্স লাইন প্রদর্শন করে। tail -fএকই কাজ করে তবে মূলত অসীম লুপে: প্রারম্ভকালে, ফাইলের শেষ এক্স লাইনগুলি দেখান, তারপরে কিছু ওএস যাদু (ইনোটিফাইয়ের মতো) ব্যবহার করে মনিটরিং করুন এবং নতুন লাইন দেখান show

এর কাজটি করতে, tailঅবশ্যই ফাইলের শেষটি সনাক্ত করতে সক্ষম হতে হবে। যদি tailফাইলটির শেষ সন্ধান না করে তবে এটি সর্বশেষ এক্স লাইনগুলি প্রদর্শন করতে পারে না, কারণ "শেষ" অপরিজ্ঞাত। সুতরাং tailএই ক্ষেত্রে কি করে ? এটি ফাইলটির শেষ না পাওয়া পর্যন্ত অপেক্ষা করে।

এই বিবেচনা:

$ chatter() { while :; do date; sleep 1; done; }
$ chatter | tail -f

এটি কখনই অগ্রগতি করে বলে মনে হয় না কারণ এখান থেকে ফাইলের কোনও নির্দিষ্ট শেষ হয় না chatter

আপনি যদি tailকোনও ফাইল সিস্টেম পাইপ থেকে শেষ লাইনগুলি দিতে বলেন তবে আপনি একই আচরণ পান। বিবেচনা:

$ mkfifo test.pipe
$ tail test.pipe

stdbufঅনুভূত সমস্যাটি সমাধানের জন্য একটি মহৎ প্রচেষ্টা ছিল। যদিও মূল ঘটনাটি হ'ল আই / ও বাফারিং এর মূল কারণ নয়: ফাইলের একটি নির্দিষ্ট শেষের অভাব। আপনি যদি পুচ্ছের সূত্রের কোডটি পরীক্ষা করে দেখেন তবে file_linesফাংশন মন্তব্যটি পড়তে হবে:

END_POS হল ইওএফের ফাইল অফসেট (শেষ বাইটের অফসেটের চেয়ে একটি বড়)।

এবং এটি যাদু। যে কোনও কনফিগারেশনে লেজের জন্য আপনার ফাইলটির শেষের প্রয়োজন need headএই সীমাবদ্ধতা নেই, এটি কেবল ফাইলের একটি সূচনা প্রয়োজন (যা এটি নাও থাকতে পারে, চেষ্টা করুন head test.pipe)। স্ট্রিমমুখী সরঞ্জামগুলির মতো sedএবং awkফাইলের শুরু বা শেষের প্রয়োজন নেই: এগুলি বাফারগুলিতে কাজ করে।


37

tail -fএর লেজ আসলে বর্তমানে কিছু অজানা, সুতরাং পরবর্তী কীভাবে tailএটি জানা উচিত । অন্যদিকে tail -fমাথাটি এমন কিছু যা ইতিমধ্যে জানা এবং এর জন্য এটি প্রক্রিয়াজাত হতে পারে।

বা এটিকে আরও সহজভাবে tailবলতে গেলে ফাইলটির শেষের সাথে তুলনামূলক, তবে আউটপুট স্ট্রিমটি tail -fকোনও ইওএফ পায় নি (অন্তত এটি শেষ হওয়ার আগে নয়) not

আপনাকে প্রথমে খুঁজে পান, তাহলে tailএর PID এবং এটি হত্যা, আপনি উচিত তারপর দ্বিতীয় থেকে আউটপুট দেখুন।


21

প্রযুক্তিগত উত্তর

ইনপুট হিসাবে কোনও স্ট্রিমের সাথে চলার সময়, প্রবাহটি পড়ার সাথে সাথে এটি পূরণ করে এমন tailএকটি nলাইন বাফার রাখে , তবে প্রবাহের শেষ প্রান্তে পৌঁছানো অবধি এই লাইনগুলি আউটপুট করতে পারে না, অর্থাৎ EOFইনপুট থেকে পড়ার চেষ্টা করার সময় এটি একটি বিশেষ কোড গ্রহণ করে স্ট্রীম। অনুরোধটি tail -fপ্রস্থান করে না, সুতরাং এটি কখনও কখনও তার প্রবাহকে বন্ধ করবে না, যা উদাহরণস্বরূপ that প্রবাহের 10 টি শেষ লাইনে ফিরে আসা অসম্ভব করে তোলে।


3

এর কাজটি tailহ'ল ইনপুট বা ফাইলের শেষ অংশ - "লেজ" - দেখানো। (বিকল্পটি -fএটি পরে কী করবে সে সম্পর্কে এটি এখানে প্রাসঙ্গিক নয়))

একটি ফাইল সম্পর্কে চিন্তা করা যাক:

কোন ফাইলের শেষ অংশটি কী ?
ধরা যাক এটি কোনও ফাইলের শেষ n লাইন

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

আমাদের শেষ রেখার অংশটি স্পষ্ট না হওয়া পর্যন্ত আমাদের রেখাটি রাখা উচিত n, বা আর এর অংশ হতে পারে না, কারণ আমরা nআরও লাইন জানি

যদি আমরা এখন ফাইলটির শেষের দিকে পৌঁছে যাই, আমরা জানি যে nআমাদের রাখা শেষ nরেখাগুলি আসলে ফাইলটির শেষ লাইন।

এখন, ক্ষেত্রে

tail -f /etc/passwd | tail

প্রথমে tailফাইলটি পড়ে এবং তার থেকে আরও ডেটা পাওয়ার জন্য অপেক্ষা করে, এটিও লিখতে। সুতরাং এটি যখন ফাইলটি পড়ে এটি শেষ হয় তখন এটি দ্বিতীয় লেজে ফাইলের শেষের সংকেত দেয় না । তা ছাড়া দ্বিতীয়টি tail কখনই ফাইলের সমাপ্তির বিষয়ে অবহিত হয় না, সুতরাং এটি প্রিন্ট করা উচিত এমন শেষ লাইনগুলি কোনটি তা কখনই আবিষ্কার করতে পারে না

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