আমি সমান্তরালে একাধিক বাশ শেল স্ক্রিপ্ট চালাতে চাই। তবে, আমি জাতিদের অবস্থা এড়াতে চাই। কোন ইউনিক্স আদেশগুলি সত্যই পারমাণবিক যা আমি এই উদ্দেশ্যে ব্যবহার করতে পারি এবং আমি কীভাবে সেগুলি ব্যবহার করতে পারি?
আমি সমান্তরালে একাধিক বাশ শেল স্ক্রিপ্ট চালাতে চাই। তবে, আমি জাতিদের অবস্থা এড়াতে চাই। কোন ইউনিক্স আদেশগুলি সত্যই পারমাণবিক যা আমি এই উদ্দেশ্যে ব্যবহার করতে পারি এবং আমি কীভাবে সেগুলি ব্যবহার করতে পারি?
উত্তর:
যদি lockfile
আপনার সিস্টেমে ইনস্টল না করা থাকে তবে mkdir
এটি কাজ করবে: এটি একটি পারমাণবিক অপারেশন এবং ডিরেক্টরিটি ইতিমধ্যে উপস্থিত থাকলে (যদি না আপনি -p
কমান্ড-লাইন স্যুইচটি যোগ না করেন) ব্যর্থ হয় add
create_lock_or_wait () {
path="$1"
wait_time="${2:-10}"
while true; do
if mkdir "${path}.lock.d"; then
break;
fi
sleep $wait_time
done
}
remove_lock () {
path="$1"
rmdir "${path}.lock.d"
}
#!/bin/bash
# Makes sure we exit if flock fails.
set -e
(
# Wait for lock on /var/lock/.myscript.exclusivelock (fd 200) for 10 seconds
flock -x -w 10 200
# Do stuff
) 200>/var/lock/.myscript.exclusivelock
এটি নিশ্চিত করে যে "(" এবং ")" এর মধ্যে কোডটি একবারে কেবল একটি প্রক্রিয়া দ্বারা চালিত হয় এবং প্রক্রিয়াটি খুব বেশি সময় ধরে লকের জন্য অপেক্ষা করে না।
lockf(1)
।
lockf(1)
যদিও এই উদাহরণে ব্যবহৃত পদ্ধতিতে কাজ করে না। এটি আর্গুমেন্ট হিসাবে কোনও ফাইল বর্ণনাকারী নম্বর নিতে পারে না।
lockfile (1) একজন ভাল প্রার্থী মত দেখাচ্ছে, যদিও হুঁশিয়ার এটাই অংশ procmail প্যাকেজ, যা আপনি আপনার মেশিনে এখনও ইনস্টল করা নাও হতে পারে। এটি একটি জনপ্রিয় পর্যাপ্ত প্যাকেজ যা এটি ইনস্টল না করা থাকলে এটি আপনার সিস্টেমে প্যাকেজ করা উচিত। আমি যে চারটি সিস্টেম পরীক্ষা করেছি তার মধ্যে তিনটিতে এটি রয়েছে এবং অন্যটিতে এটি উপলব্ধ।
এটি ব্যবহার করা সহজ:
#!/bin/sh
LOCKFILE=$HOME/.myscript/lock
mkdir -p `dirname $LOCKFILE`
echo Waiting for lock $LOCKFILE...
if lockfile -1 -r15 $LOCKFILE
then
# Do protected stuff here
echo Doing protected stuff...
# Then, afterward, clean up so another instance of this script can run
rm -f $LOCKFILE
else
echo "Failed to acquire lock! lockfile(1) returned $?"
exit 1
fi
আমি যে বিকল্পগুলি দিয়েছি সেগুলি 15 সেকেন্ড পর্যন্ত সেকেন্ডে একবার চেষ্টা করে। যদি আপনি এটি চিরকাল অপেক্ষা করতে চান তবে "-r" পতাকাটি ফেলে দিন।
mkdir()
POSIX ফাইল সিস্টেমে সিস্টেম কলটি পারমাণবিক। সুতরাং, mkdir
কমান্ডটি এমনভাবে ব্যবহার করা যাতে এতে mkdir()
আপনার উদ্দেশ্য অর্জনের জন্য হ'ল একটি কল জড়িত । (আইওডাব্লু, ব্যবহার করবেন না mkdir -p
) সংশ্লিষ্ট আনলক rmdir
অবশ্যই হয়।
ক্যাভেট এমপোটার: mkdir()
নেটওয়ার্ক ফাইল সিস্টেমে পারমাণবিক নাও থাকতে পারে।
rmdir
তাই পারমাণবিক?
হয়ত লকফিল কমান্ড আপনার যা প্রয়োজন তা করবে।
lockfile ~/.config/mylockfile.lock
.....
rm -f important.lock
আপনি যদি কেবল ইউনিক্সে চলছেন তবে ফিফোস ব্যবহার করুন। আপনি ফিফোতে কাজের রেকর্ড লিখতে পারেন এবং এই ফাইলটি থেকে প্রক্রিয়াগুলি পড়তে পারেন এবং আপনার পাঠকরা ফিফোগুলিতে অবরুদ্ধ হবে।
লক ফাইলগুলি ঠিক আছে তবে আপনি যা বর্ণনা করেন তার জন্য আমি ফিফোসের সাথে যাব
এখানে যেমন পোস্ট করা হয়েছে: " শেল স্ক্রিপ্টগুলিতে লকিং সঠিক? ", FLOM (ফ্রি লক ম্যানেজার) সরঞ্জাম ব্যবহার করে, কমান্ড এবং শেল স্ক্রিপ্টগুলি সিরিয়ালাইজিং চালানো তত সহজ হয়ে যায়
flom -- command_to_serialize
FLOM আপনাকে আরও নমনীয় ব্যবহারের কেসগুলি (বিতরণ লকিং, পাঠক / লেখক, সংখ্যার সংস্থানসমূহ ইত্যাদি) বাস্তবায়িত করার অনুমতি দেয় এখানে এখানে বর্ণিত হয়েছে: http://sourceforge.net/p/flom/wiki/FLOM%20by%20ex উদাহরণ/
make(1)
করতে দেয় ? (যেমন, আপনারmake -j 9
যদি 8 টি কোর থাকে)? এটি সূক্ষ্ম গ্রানুলারিটির সাথে ইন্টারলিভিং কাজের অতিরিক্ত সুবিধা পেয়েছে।