যদি আপাচি কোনও জায়গায় কোনও ধরণের ফাইল লিখছে এবং এটি লেখার কাজ শেষ না করে এবং rsync
কিক ইন করে, rsync
সেখানে বসে যা আছে তা অনুলিপি করবে।
অর্থাত যদি আপাচি একটি 5 এমবি ফাইল নিয়ে কাজ করে তবে কেবল 2 এমবি লিখিত থাকে এবং rsync
কিক ইন হয়, আংশিক 2 এমবি ফাইলটি অনুলিপি করা হবে। সুতরাং ফাইলটি মনে হবে এটি গন্তব্য সার্ভারে "দূষিত"।
আপনি যে ফাইলগুলি ব্যবহার করছেন তার আকারের উপর নির্ভর করে আপনি নিম্নলিখিতগুলি করতে --inplace
বিকল্পটি ব্যবহার করতে পারেন rsync
:
এই বিকল্পটি পরিবর্তন করে যে ফাইলের ডেটা আপডেট করার দরকার পড়লে আরএসএনসি ফাইলটি কীভাবে স্থানান্তর করে: ফাইলের নতুন কপি তৈরি করার পরে এটি সম্পূর্ণ হওয়ার পরে এটি স্থানটিতে স্থানান্তরিত করার পরিবর্তে, আরএসআইএনসি পরিবর্তে আপডেট করা ডেটা সরাসরি গন্তব্যে লেখেন ফাইল।
এর সুবিধাটি হ'ল যদি কোনও 5 এমবি ফাইল কেবল প্রথম রানটিতে 2 এমবি অনুলিপি করে থাকে, পরের রানটি 2 এমবিতে উঠবে এবং পূর্ণ 5MB স্থিত না হওয়া পর্যন্ত ফাইলটি অনুলিপি করতে থাকবে।
নেতিবাচক বিষয়টি হ'ল এটি এমন একটি পরিস্থিতি তৈরি করতে পারে যেখানে কোনও ফাইল অনুলিপি করার সময় কেউ ওয়েব সার্ভার অ্যাক্সেস করছে এবং তারপরে তারা একটি আংশিক ফাইল দেখতে পাবে। আমার মতে rsync
এটি একটি "অদৃশ্য" ফাইল ক্যাশে করা এবং তারপরে এখুনি জায়গায় স্থানান্তরিত করা এর ডিফল্ট আচরণে সবচেয়ে ভাল কাজ করে। তবে --inplace
পরিস্থিতিগুলির জন্য ভাল যেখানে বড় ফাইলগুলি এবং ব্যান্ডউইথ সীমাবদ্ধতাগুলি একটি বড় ফাইলটিকে সহজেই বর্গ একের থেকে অনুলিপি করার পথে দাঁড়াতে পারে।
এটি বলেছিল যে আপনি এটি বর্ণনা করেন; জোর আমার:
প্রতি পাঁচ মিনিটে ক্রোন রান আরএসসিএন হয় ...
সুতরাং আমি ধরে নিই যে এই ক্রোন জবটি পরিচালনা করার জন্য আপনার কাছে কিছু বাশ স্ক্রিপ্ট রয়েছে? ভাল, জিনিসটি rsync
কেবলমাত্র অনুলিপি করা ফাইলগুলি অনুলিপি করার জন্য যথেষ্ট স্মার্ট। এবং যদি আপনার কাছে এমন স্ক্রিপ্ট থাকে যা প্রতি 5 মিনিটের মধ্যে rsync
চলে তবে এটি দ্রুত চলে গেলে আপনি একে অপরের দিকে পদক্ষেপ না এড়াতে চেষ্টা করছেন । অর্থ, আপনি যদি প্রতি মিনিটে এটি চালান, এমন একটি ঝুঁকি রয়েছে যে rsync
ফাইলের আকার বা নেটওয়ার্কের গতির কারণে এক বা একাধিক প্রক্রিয়া এখনও চলছে এবং পরবর্তী প্রক্রিয়াটি কেবল এটির সাথে প্রতিযোগিতায় থাকবে; একটি দৌড় শর্ত
এটি এড়ানোর এক উপায় হ'ল rsync
বাশ স্ক্রিপ্টে আপনার পুরো কমান্ডটি মোড়ানো যা কোনও ফাইল লক পরীক্ষা করে; নীচে আমি এই জাতীয় ক্ষেত্রে ব্যবহার করি একটি বয়লারপ্লেট বাশ স্ক্রিপ্ট ফ্রেমওয়ার্ক।
মনে রাখবেন যে কিছু লোক ব্যবহারের পরামর্শ দিবেন flock
তবে যেহেতু flock
আমি যে কয়েকটি সিস্টেমে ব্যবহার করি সেগুলিতে ইনস্টল করা হয়নি — এবং আমি উবুন্টু (যা এটি রয়েছে) এবং ম্যাক ওএস এক্সের (যা না) অনেকের মধ্যে ঝাঁপিয়ে পড়েছি — আমি কোনও বাস্তব সমস্যা ছাড়াই এই সাধারণ কাঠামোটি ব্যবহার করি:
LOCK_NAME="MY_GREAT_BASH_SCRIPT"
LOCK_DIR='/tmp/'${LOCK_NAME}.lock
PID_FILE=${LOCK_DIR}'/'${LOCK_NAME}'.pid'
if mkdir ${LOCK_DIR} 2>/dev/null; then
# If the ${LOCK_DIR} doesn't exist, then start working & store the ${PID_FILE}
echo $$ > ${PID_FILE}
echo "Hello world!"
rm -rf ${LOCK_DIR}
exit
else
if [ -f ${PID_FILE} ] && kill -0 $(cat ${PID_FILE}) 2>/dev/null; then
# Confirm that the process file exists & a process
# with that PID is truly running.
echo "Running [PID "$(cat ${PID_FILE})"]" >&2
exit
else
# If the process is not running, yet there is a PID file--like in the case
# of a crash or sudden reboot--then get rid of the ${LOCK_DIR}
rm -rf ${LOCK_DIR}
exit
fi
fi
ধারণাটি হ'ল সেই সাধারণ কোর - যেখানে আমার আছে। echo "Hello world!"
যেখানে আপনার স্ক্রিপ্টের হৃদয় রয়েছে। এটির বাকীটি মূলত একটি লকিং মেকানিজম / লজিক ভিত্তিক mkdir
। ধারণার একটি ভাল ব্যাখ্যা এই উত্তরে :
mkdir একটি ডিরেক্টরি তৈরি করে যদি এটি এখনও বিদ্যমান না থাকে, এবং যদি এটি হয় তবে এটি একটি প্রস্থান কোড নির্ধারণ করে। আরও গুরুত্বপূর্ণ বিষয়, এটি এই একক পারমাণবিক ক্রিয়ায় এটি করে যা এই দৃশ্যের জন্য নিখুঁত করে তোলে।
সুতরাং আপনার rsync
প্রক্রিয়া ক্ষেত্রে , আমি echo
আপনার rsync
কমান্ড থেকে কমান্ড পরিবর্তন করে এই স্ক্রিপ্ট ব্যবহার করার পরামর্শ দিচ্ছি । এছাড়াও, এর LOCK_NAME
মতো কিছুতে পরিবর্তন করুন RSYNC_PROCESS
এবং তারপরে আপনি ভাল।
এখন rsync
এই স্ক্রিপ্টটিতে আপনার মোড়কের সাহায্যে, আপনি প্রতি মিনিটে কোনও রেসিং শর্তের ঝুঁকি ছাড়াই ক্রোন জব সেট করতে পারেন যেখানে দুই বা ততোধিক rsync
প্রক্রিয়া একই কাজ করার জন্য লড়াই করছে। এটি আপনাকে গতি বা rsync
আপডেটগুলি বাড়িয়ে তুলবে যা আংশিক ফাইল স্থানান্তরিত হওয়ার সমস্যাটি দূর করবে না, তবে এটি সামগ্রিক প্রক্রিয়াটিকে গতিতে সহায়তা করবে যাতে কোনও পর্যায়ে পুরো ফাইলটি সঠিকভাবে অনুলিপি করা যায়।