নন-ব্লকিং বাফার নামক পাইপ?


20

আমি এমন কিছু সন্ধান করছি যা আমার সন্দেহের অস্তিত্ব নেই: কমান্ড লাইন থেকে ব্যবহারের জন্য একটি অ-ব্লক করা বাফার্ড নামক পাইপ (ফিফো)। সেখানে কি এমন জিনিস আছে?

এখানে ব্যবহারের কেসটি ধরুন: ধরুন আমার কাছে এমন একটি প্রক্রিয়া রয়েছে যা ব্যাকগ্রাউন্ডে দীর্ঘ সময় চলে এবং প্রচুর আউটপুট বানান stdout। আমি আউটপুটটির বিষয়ে সত্যই চিন্তা করি না এবং এটি সঞ্চয় করতে চাই না (সম্ভবত আমার পর্যাপ্ত জায়গা নেই) তবে আমি পর্যায়ক্রমে "ড্রপ" করতে এবং এটি যা করছে তা অনুসরণ করতে চাই, তারপরে আবার বাদ পড়ি এবং এটি এর কাজ করতে ছেড়ে দিন। তাই আমি এর আউটপুটটি এই তাত্ত্বিক বাফার, নামক পাইপ-অ-ব্লক করা পাইপটিতে পুনর্নির্দেশ করতে চাই এবং পরে পর্যায়ক্রমে এতে আলতো চাপতে চাই।

সুতরাং মূলত আমি এটি শুরু করতে চাই ( 10Mবাফারের আকার হিসাবে):

mkmagicfifo magicfifo 10M
spewingprocess > magicfifo &

... এবং পর্যায়ক্রমে কী চলছে তা দেখার জন্য ড্রপ করুন ...

tail -f magicfifo

... ছাড়া magicfifo সব আউটপুট (তাই হয়, না একটি স্বাভাবিক ফাইল) সংরক্ষণকারী এবং ছাড়া এটা spewing প্রক্রিয়া ব্লক যখন এটি fills আপ এবং চাপড় মেরে না হয় (তাই হয়, পুরোপুরি একটি স্বাভাবিক নামে পাইপ)।

সমাধানগুলি জড়িত tailবা pruneএটি করবে বলে আমি মনে করি না (ভাল, আমি জড়িত একটি কার্যবিধির কথা ভাবতে পারি tail), কারণ tailএখনও আমার সমস্ত ডেটা কোথাও সংরক্ষণ করার প্রয়োজন হবে (যদি আমি এটিকে সন্ধান করতে এবং বাদ দিতে চাই), এবং pruneফাইলটি নতুন করে লিখতে হবে, সম্ভবতঃ (আমি স্বীকার করব যে আমি এটি চেষ্টা / প্রমাণিত করিনি) সমস্ত আউটপুট উত্পন্ন করার প্রক্রিয়াটির পুনর্নির্দেশটি ভঙ্গ করে।

আমি আশা করি এটি করার জন্য আমি কিছু ইউটিলিটি লিখতে পারি, তবে * নিক্সে ফাইল এবং পাইপ এবং এর মতো অনেক দুর্দান্ত দিক রয়েছে, আমি কেবল সহায়তা করতে পারি না তবে মনে হয় এটি বিদ্যমান এবং আমি এটি সম্পর্কে জানি না।

সুতরাং: এই জাতীয় জিনিস আছে, এবং যদি তাই হয় কি?


1
আপনি যা বর্ণনা করছেন তা হ'ল "রিং বাফার" বা "বিজ্ঞপ্তি বাফার"। আমি এ জাতীয় জিনিস বজায় রাখার জন্য কোনও কমান্ড লাইন সরঞ্জাম সম্পর্কে সচেতন নই, যদিও এটি তৈরি করা তুচ্ছ হবে।
শন জে গফ

2
, "লিনাক্স (ডিমান্ড লগিং দিকে) FIFO অ ব্লক" বর্ণিত সমাধান কটাক্ষপাত আছে stackoverflow.com/questions/7360473/...

1
: এই মত দেখায় Stackoverflow উপর সমাধান করা হয়েছে stackoverflow.com/questions/7360473/...
জেমস ব্ল্যাকবার্ন

@ জেমস ব্ল্যাকবার্ন: ধন্যবাদ! অনেক আগ্রহব্যাঞ্জক.
টিজে ক্রোডার

উত্তর:


16

আমি মনে করি গনুহ কি আপনি খুঁজছেন হয় screen। এক বা একাধিক প্রোগ্রাম থেকে শেষ স্ক্রিনটি পুরো বা দুটি আউটপুট ধরে রাখতে এটি বাফারকে বজায় রাখে এবং আপনাকে সংযোগ বিচ্ছিন্ন করতে এবং পরে ফিরে আসতে দেয়।


+1 পর্দার পরামর্শ দেওয়ার জন্য। বিটিডাব্লু, আপনি প্রচুর "ইতিহাস রেখা" ধরে রাখতে এটি কনফিগার করতে পারেন।
মিঃ শুঞ্জ

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

হ্যাঁ, আপনি এইভাবে জিএনইউ স্ক্রিনটি ব্যবহার করতে পারেন। আপনি একটি নতুন (সম্ভাব্য নামযুক্ত) সেশন তৈরি করবেন, সেই অধিবেশনটির অভ্যন্তরে আপনার কমান্ডটি পরিচালনা করবেন এবং তারপরে সংযোগ বিচ্ছিন্ন করুন।
টিএমএল

2
এর রয়েছে tmuxএবং dtach- টার্মিনাল মাল্টিপ্লেক্সার / সেশন ম্যানেজার আবেদন একই শ্রেণীতে কিছু একই জিনিস অর্জন করতে সক্ষম হওয়া উচিত।
jw013

5

আপনি ব্যবহার করতে পারেন pv, এটি পাইপলাইনে আপনার পছন্দমতো বাফারিং সরবরাহ করে। আপনি এটি এর মতো ব্যবহার করতে পারেন:

sprewingprocess | pv -B 1g > ordinaryfifo &

এটি আপনাকে 1 জিবি spewingprocessএবং ফিফোর মধ্যে বিফারিং দিতে দেবে। বেশিরভাগ লিনাক্স ডিস্ট্রিবিউশন pvএকটি প্যাকেজে অফার দেয় , এটি বিশ্বাস করুন বা না করুন pv


ধন্যবাদ, তবে যদি আমি পাইপ নামের টার্গেটটি না পড়ি তবে একবার বাফারটি পূর্ণ হলে সেই ব্লকটি হবে না?
টিজে ক্রাউডার

1
হ্যাঁ, তবে আপনার কী পছন্দ আছে? সীমাবদ্ধ মহাবিশ্বে আপনার আক্ষরিক সীমাহীন বাফারিং থাকতে পারে না।
ডেভিড শোয়ার্জ

অন্য পছন্দটি আমি আমার প্রশ্নে বর্ণিত হিসাবে: সমস্ত আউটপুট সংরক্ষণ করে না। বাফার পূর্ণ হয়ে গেলে, পুরানো জিনিসগুলি ফেলে দেওয়া হয়।
টিজে ক্রাউডার

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

1

আমারও একই সমস্যা ছিল। এটি আমার প্রথম সমাধান। প্রথমে কোনও ফাইলে আউটপুট লিখুন যা আমরা প্রতিটি লাইনের পরে কেটে ফেলি যাতে এটি অনির্দিষ্টকালের জন্য বৃদ্ধি না করে:

spewingprocess | while read line; do echo $line > buffer.txt ; done

তারপরে লেজটি ব্যবহার করে ফাইলটি পড়ুন (যেখানে 2> /dev/null"ফাইল কাটা" ত্রুটি বার্তাটি মুক্তি পায়):

tail -f ./buffer.txt 2> /dev/null

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

for ((i=0; ; i++)) ; do echo "$i" ; done | while read line; do  echo $line > buffer.txt ; done
tail -f ./buffer.txt 2> /dev/null > log.txt

কিছুক্ষণ চলার পরে প্রথম এবং শেষ লাইনগুলি হ'ল:

$ head -n 1 log.txt
0
$ tail -n 1 log.txt
78783

তবে ফাইলটিতে কম লাইন রয়েছে, তাই কিছু হারিয়ে গেছে:

$ wc log.txt
67087  67087 392819 log.txt

তবুও এটি একটি দুর্দান্ত সমাধান বলে মনে হয় যদি আপনি ডেটা হ্রাস সম্পর্কে খুব বেশি যত্ন না করেন বা যখন আপনার স্পিচিং প্রসেস ডেটা হারাতে যথেষ্ট দ্রুত হয় না।

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