ব্যাশে কোনও ফাইলে অ্যাটমিক রাইটিং অপারেশন করা Per


13

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

echo "$RESULT" >> `pwd`/$TEMP_DIR/$OUT_FILE

সমস্ত একযোগে চলমান স্ক্রিপ্টগুলি থেকে সেই ফাইলের অণুতে সমস্ত লেখার ক্রিয়াকলাপ করা কীভাবে সম্ভব (যাতে এক উদাহরণের ডেটা অন্য উপাত্তের সাথে ডেটাকে ওভারল্যাপ করে না)?


1
FYI আপনার প্রয়োজন নেই `pwd`; আপনি কেবল একটি বিন্দু ( .) ব্যবহার করতে পারেন । এছাড়াও আপনার পুরো ফাইলটির নামটি উদ্ধৃত করা উচিত কারণ এটিতে ভেরিয়েবল অন্তর্ভুক্ত রয়েছে
ওয়াইল্ডকার্ড

1
আপনি এফআইএফও ব্যবহারের সম্ভাবনাটিও দেখতে চাইতে পারেন ।
ওয়াইল্ডকার্ড

@ উইল্ডকার্ড ধন্যবাদ আমি pwdবর্তমানে স্ক্রিপ্টটিতে ব্যবহারকারীর বর্তমান কার্যকরী ডিরেক্টরি সম্পর্কে অবহিত করতে এবং একটি লগ ফাইলে এন্ট্রি লিখতে চাইছিলাম। এখনই ফিফোর উপর নজর রাখছি।
সেবি

1
আসলে এই সাইটে ঠিকই ফিফোর আরও ভাল পরিচিতি রয়েছে ; আমি কয়েক মিনিট আগে যে লিঙ্কটি সরবরাহ করেছি তা হ'ল পসিক্স স্প্যাক্স mkfifoএবং হুবহু পরিচিতি স্তর নয়।
ওয়াইল্ডকার্ড

এটি কোনও ফিফো বা কোনও ফাইলই হোক না কেন, আপনি এখনও দু'টি উদাহরণ একই সাথে লেখার এবং একে অপরের আউটপুটগুলিকে গারবল করার ঝুঁকিটি চালান।
ক্লেক

উত্তর:


10

মনে হচ্ছে আপনার flockযেমনটি মানুষের (যেমন: http://linux.die.net/man/1/flock ) উদাহরণ হিসাবে ব্যবহার করা দরকার

(
flock -x 200

# Put here your commands that must do some writes atomically

) 200>/var/lock/mylockfile 

এবং আপনার সমস্ত কমান্ডগুলি অবশ্যই পরমাণুতে () এ থাকা উচিত।


রাইট অপারেশনটি পারমাণবিক হবে যদিও (flock -s 200 # এখানে আপনার কমান্ডগুলি লিখুন যা কিছুকে অবশ্যই পরমাণুভাবে লিখতে হবে) 200> / var / লক / মাইলোকফিল একাধিক যুগপত চলমান স্ক্রিপ্টগুলিতে ছড়িয়ে যায়? অথবা, বিপরীতে, লকটি কেবলমাত্র / var / লক / মাইলকফাইলে সম্পর্কিত?
সেবি

1
আপনার স্ক্রিপ্ট লক / ভার / লক / মাইলকফাইল, তবে আপনার স্ক্রিপ্টের কেবলমাত্র একটি উদাহরণ এতে রাইটিং লক পেতে পারে। অন্যান্য দৃষ্টান্ত অপেক্ষারত অপেক্ষা করবে /var/lock/mylockfileলক করার জন্য উপলব্ধ।

-s হ'ল একটি ভাগ করা লক - পড়ার জন্য উপযুক্ত, একটি রাইটিং লকের জন্য আপনাকে অবশ্যই -x / -e ব্যবহার করতে হবে। এটি আপনি লিঙ্ক করেছেন ম্যান পেজে।
ইভান বেন

এই কোডটিতে আনলকটি কখন ঘটে? যত তাড়াতাড়ি কিছু /var/lock/mylockfileবলা হয় প্রক্রিয়া দ্বারা লিখিত হয় flock -x?
ক্রিস স্ট্রাইজিনস্কি

@ ক্রিসট্রিস্টাইজেনস্কি আপনি (flock -x 200; date; sleep 10; date;) 200>/var/lock/mylockfileদুটি শাঁটে এই উদাহরণটি চালাতে পারেন এবং দেখুন যে () এর সমস্ত কমান্ড কার্যকর হওয়ার পরেই আনলকগুলি ঘটে (এটি একটি

4

flockইন্টারলকিং অপারেশনগুলির অন্যতম উপায়। ইউটিলিটি ইউজ-লিনাক্স টুলসেটের অংশ এবং এটি কেবল লিনাক্সের জন্য উপলব্ধ। প্ল্যাটফর্মের বিস্তৃত পরিসর জুড়ে উপলভ্য অন্যান্য ইউটিলিটিগুলি setlockতার ডেমোনটোলস প্যাকেজ থেকে ড্যানিয়েল জে বার্নস্টেইনের ইউটিলিটিটির চারপাশে ভিত্তি করে :

  • setlock ডিমনটোল থেকে
  • setlock ব্রুস গেন্টারের ডিমনটোলস-এনকোর থেকে
  • s6-setlock লরেন্ট বেরকোট এর এস from থেকে
  • chpst জেরিট পেপের রানিট থেকে
  • runlock ওয়েইন মার্শালের বিড়ম্বনা থেকে
  • setlock আমার নশ টুলসেট থেকে

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

প্রশ্ন এক ক্ষেত্রে কমান্ড যে আউটপুট লাইন উত্পাদন করে জেনে রাখুন যে এই পূজা একটি হচ্ছে interlock আবশ্যক বহিরাগত echo শেল স্থানে বিল্ট-ইন echoকমান্ড প্রয়োগ করুন:

সেটলক মাইলোকফাইল প্রতিধ্বনি "$ ফলাফল" >>। / $TEMP_DIR/$OUT_FILE

এই ক্ষেত্রে অ্যাপেন্ড মোডে আউটপুট ফাইলটি খোলার ইন্টারলক করা প্রয়োজন হয় না। যদি থাকতো, এক লক, যা মত প্রোগ্রাম ব্যবহার হয় প্রয়োজনীয়তা মধ্যে যে ফাইল খোলার জন্য হবে fdredir/ redirfd:

সেটলক মাইলোকফিল fdredir - অ্যাপেন্ড 1 "./$TEMP_DIR/$OUT_FILE" প্রতিধ্বনি "ES ফলাফল"
কেউ চাইলে কোনটি শেল ফাংশনে রূপান্তর করতে পারে:

আউটফাইল () {মাইলকফায়াল fdredir --append 1 "সেট করুন। / EMTEMP_DIR/$OUT_FILE" "$ @"; } 
[…]
আউটফাইলে প্রতিধ্বনি "ES ফলাফল"
বা শেল সিনট্যাক্সের সাথে লেগে থাকা এবং এটি ইন্টারলকের নীচে চলতে থাকা দ্বিতীয় শেল দ্বারা ব্যাখ্যা করে, যদি কারও শেল ভেরিয়েবল পরিবেশের ভেরিয়েবল হিসাবে রফতানি না হয় তবে কিছু অ-তুচ্ছ উদ্ধৃতি আবশ্যক:

সেটলক মাইলোকফাইল sh -c 'প্রতিধ্বনি "" ES ফলাফল "" >> "./'$TEMP_DIR'/'$OUT_FILE'" '

এটি অবশ্যই আউটপুট ফাইলগুলিতে লেখা ব্যতীত অন্য বিষয়গুলিকে সাধারণীকরণ করে:

সেটলক মাইলকফিল sh -c '... আন্তঃযুক্ত; জিনিসপত্র …'

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