কোনও ফাইলে আউটপুট পুনঃনির্দেশ করা ফাইলটিতে লক প্রয়োগ করে?


30

আমার যদি কমান্ড থাকে

$ ./script >> file.log

প্রথমবারটি শেষ হওয়ার আগেই দ্বিতীয় কলটি ঘটে যা দ্বিগুণ বলা হয়, কী ঘটে?

প্রথম কলটি কি আউটপুট ফাইলে একচেটিয়া লক পায়? যদি তাই হয়, দ্বিতীয় স্ক্রিপ্টটি লেখার চেষ্টা করার সময় ব্যর্থ হয়, বা শেল কি আউটপুট গ্রহণ করে (স্ক্রিপ্টটি শেষ হতে দেয়) এবং ত্রুটি ছুঁড়ে দেয়?

অথবা লগ ফাইলটি দুবার লিখিত হয়?


1
আমি কোনও সিস্টেম জানি না যা ডিফল্টরূপে ফাইলটি লক করে দেয় would আরও বেশি সম্ভাবনা হ'ল দুটি প্রোগ্রাম তাদের লেখার আন্তঃলিখন শেষ করবে, যেহেতু উভয়ই অ্যাডেন্ড মোডে থাকবে। ফলাফলগুলি বরং অনাকাঙ্ক্ষিত হবে। "হ্যালো ওয়ার্ল্ড" এর পরিবর্তে আপনি "hweolrllod" পেতে পারেন।
jw013

উত্তর:


18

যেহেতু আপনি ব্যবহার করছেন >>, যার অর্থ সংযোজন, প্রতিটি ঘটনা থেকে আউটপুট প্রতিটি লাইন এটি ক্রম সংযোজন করা হবে।

যদি আপনার স্ক্রিপ্ট আউটপুট প্রতিটি এবং উদাহরণ দুটির মধ্যে এক সেকেন্ড বিলম্বের সাথে প্রিন্ট 1\nকরে 5\nতবে 2.5 সেকেন্ড পরে আপনি এটি পাবেন:

1
2
1
3
2
4
3
5
4
5

সুতরাং আপনার প্রশ্নের উত্তর দিতে: না।


23

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

আপনি যদি আপনার স্ক্রিপ্টের একযোগে অন্যান্য দৃষ্টান্তগুলির একে অপরের পায়ের আঙ্গুলগুলিতে না চলতে চান তবে আপনার যেমন একটি স্পষ্টত লকিং প্রক্রিয়া ব্যবহার করা দরকার ।flock lockfile

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

খারাপ জিনিসটি ঘটতে পারে তা হ'ল যদি উদাহরণগুলির মধ্যে একটির বিভিন্ন অংশ আউটপুট লিখে এবং সেগুলি একসাথে বেরিয়ে আসার প্রত্যাশা করে। এক নজরে লেখাগুলির লেখার মধ্যে, অন্যান্য দৃষ্টান্তগুলি তাদের নিজস্ব লেখাগুলি সম্পাদন করতে পারে। উদাহরণস্বরূপ, উদাহরণস্বরূপ যদি 1 লিখেন foo, তবে উদাহরণ 2 লিখবে helloএবং কেবল তখন উদাহরণ 2 লিখবে bar, তবে ফাইলটি থাকবে foohellobar

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

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