নামী পাইপের রিটার্ন সন্ধান () অপারেশনগুলি কী সফল করা সম্ভব?


12

এটি করার কী কোনও উপায় আছে যাতে প্রোগ্রামগুলি যখন seek()কোনও নামযুক্ত পাইপে অপারেশন করার চেষ্টা করে তা সফলভাবে ফিরে আসবে (তবে এমন কাজ করুন যে পাইপটি খালি ফাইল ছিল) পরিবর্তে 'অবৈধ সন্ধান' না করে?

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

  • একটি প্রোগ্রাম একটি লগ ফাইলটিতে লিখতে চায় যা syslog-ng একটি নামক পাইপ হিসাবে তৈরি করেছে এবং সেখান থেকে পড়ছে। প্রোগ্রামটি seek()কোনও কারণে একটি সঞ্চালন করতে চায় এবং তারপরে ব্যর্থ হয়।
  • একটি প্রোগ্রাম (যেমন অস্বীকৃতি বা ব্যর্থ2ban) কোনও লগ ফাইল থেকে পড়তে চায় যা syslog-ng একটি নামক পাইপ হিসাবে তৈরি করেছে এবং এতে লিখন করছে। প্রোগ্রামটি এতে একটি সম্পাদন করতে চায় seek()এবং ব্যর্থ হয়।

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

সুতরাং এমন কিছু বিকল্প আছে যা নামী পাইপগুলিতে সেট করা যেতে পারে যাতে সেগুলি সেভাবে আচরণ করে? যদি না থাকে তবে এমন কোনও মোড সেট করা যেতে পারে যখন সিসলগ-এনজি এইভাবে আচরণ করার জন্য পাইপটি খুলবে (আমি কোড পরিবর্তন করতে উন্মুক্ত)? নাকি আমি খাঁড়ি আপ?

উত্তর:


10

লিনাক্স কার্নেলের জন্য সন্ধানযোগ্য পাইপগুলির প্রস্তাব দেওয়া হয়েছে, তবে সেগুলি প্রয়োগ করার জন্য আমি কোনও কার্যকরী প্যাচ সম্পর্কে অবগত নই।

আপনি একটি LD_PRELOAD'এডি লাইব্রেরি ব্যবহার করতে পারেন যা lseekনির্দিষ্ট ফাইলগুলিতে কলকে ওভাররাইড করে । এই উদ্দেশ্যে আমি কোনও অফ-শেল্ফ র‍্যাপারটি জানি না। ছায়াফগুলি একটি লিখতে সাহায্য করতে পারে।


1
আমি LD_PRELOAD রুটটি চেষ্টা করব। সর্বাধিক সমাধান নয়, তবে করণীয় হওয়া উচিত।
প্যাট্রিক

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

@ পাইওটারডব্রোগোস্ট Fকম কমান্ডের পরিপ্রেক্ষিতে , যদি এক থেকে এক সেকেন্ডের জন্য কোনও আউটপুট না পায় তবে স্ক্রিনটি রিফ্রেশ করা কম পক্ষে যথেষ্ট হবে। পাইপগুলিকে সন্ধানযোগ্য করে তোলা সাহায্য করবে না: প্রাসঙ্গিক পার্থক্যটি Fএটি ফাইলের শেষের দিকে চলে যায়, তারপরে ডেটা শেষের আগে উপস্থিত হওয়ার জন্য অপেক্ষা করে - তবে একটি পাইপের জন্য, লেখক ফাইলটি বন্ধ করলেই ফাইলের সমাপ্তি ঘটে।
গিলস

1

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

এছাড়াও যদি লগ ফাইলটিকে কোনও নামযুক্ত পাইপের সাথে প্রতিস্থাপন করা হয়, তবে একসাথে এটি থেকে কেবলমাত্র একটি প্রক্রিয়া পড়তে পারে। পরিবর্তে এটি একটি সকেট হওয়া উচিত।


2
পাইপগুলিতে কাজ করার অর্থ এই নয় যে পাইপগুলিতে কাজ করা যায় না। ফাইলের শেষে কি হবে যদি আবেদন কেবল একটি SEEK_END করছে পেতে? অথবা এটি বর্তমান অবস্থানটি খুঁজতে একটি SEEK_CUR করছে। এই ত্ত যদি আমি চাইতে এর ফলাফল সম্পর্কে প্রোগ্রাম lied কোনো সমস্যা কারণ হবে। একমাত্র জায়গা যে বিরতি দেবে যদি আবেদন ফিরে যেতে চেষ্টা ছিল এবং ঊর্ধ্বলিপি তা লগ ফাইল সঙ্গে কাজ করা উচিত না ইতিমধ্যে লিখিত তথ্য। এবং হ্যাঁ, আমি প্রতি-পাইপ-প্রতি পাইপ সীমাবদ্ধতা সম্পর্কে সচেতন। এই সমস্যা হবে না।
প্যাট্রিক

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

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

1
@ পেট্রিক, প্রাক্তনদের জন্য, যদি এটি যুক্ত হয় তবে এটি অ্যাপেন্ড মোডে ফাইলটি আবার খোলা উচিত op এই ক্ষেত্রে আপনি পড়ার বিষয়ে কথা বলছেন, সেক্ষেত্রে, এখনও পড়েনি এমন নতুন ডেটা এড়িয়ে যাওয়ার কোনও মানে হয় না (এবং নীরবে অনুসন্ধানটি উপেক্ষা করলে তা ভেঙে যাবে)। পরেরটি হিসাবে, যদি এটি চেষ্টা করে সেই ফাইলটি বন্ধ করে এবং পুনরায় খোলার পরে একই অবস্থানে ফিরে যাওয়ার চেষ্টা করে যা কোনও পাইপের উপর ব্রেক হয়ে যায় তবে আপনি যদি চুপচাপ চেষ্টাটি উপেক্ষা করেন, যেহেতু এটি পাইপ বন্ধ করে দিলে সার্ভারটি একটি সিপাইপাইপ পায়, যা সম্ভবত এটি এটিকে পুনরায় সেট করে দেয় যাতে পরবর্তী ক্লায়েন্টটি পাইপ খোলার শুরুতে শুরু হয়।
psusi
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.