ক্র্যাশ না করে কীভাবে ভাগ করা লাইব্রেরি আপগ্রেড করবেন?


18

এখানে বলা হয়েছে যে আপনি এক্সিকিউটেবল ফাইলটি আবার লিখতে পারেন এবং প্রক্রিয়াটি ঠিকঠাক চলবে - কোনও প্রক্রিয়া পুনরায় আরম্ভ হলে এটি পুনরায় পড়বে।

যাইহোক, প্রক্রিয়া চলাকালীন আমি যখন বাইনারি ফাইলটি প্রতিস্থাপন করার চেষ্টা করি (scp সহ, dev থেকে টেস্ট সার্ভারে) এটি 'ফাইল ব্যস্ত' বলে। এবং যদি আমি একটি ভাগ করা লাইব্রেরি ফাইল (* .so) প্রতিস্থাপন করি তবে এর সাথে সংযুক্ত সমস্ত প্রক্রিয়া ক্র্যাশ হয়ে যায়।

কেন এমন? আমি কিছু অনুপস্থিত করছি? কোনও প্রক্রিয়া বন্ধ / ক্রাশ না করে আমি বাইনারি ফাইলগুলি কীভাবে প্রতিস্থাপন করতে পারি?


নির্ভরতা যাচাই করতে আপনি .soফাইলটি চেক করতে পারেনldd filename.so
রাহুল পাতিল

আমি নির্ভরতা জানি। আমি চলমান প্রক্রিয়াগুলিকে প্রভাবিত না করে সেই ফাইলগুলি প্রতিস্থাপনের একটি উপায় চাই।
স্যাম

ডাউনটাইম প্রয়োজন .. বা আপনি পছন্দ করতে পারেন stop app && create symlink of .so && start app
রাহুল পাতিল

উত্তর:


21

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

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

অতএব আপডেট করার সঠিক উপায় হ'ল:

  1. ফাইলটি সরিয়ে ফেলা যা ফাইল সিস্টেম থেকে ডেটা সম্পর্কিত রেফারেন্স সরিয়ে দেয়, যাতে এটি নতুনভাবে তৈরি হওয়া অ্যাপ্লিকেশনগুলির জন্য অ্যাক্সেসযোগ্য না হয় যা ইতিমধ্যে এটি উন্মুক্ত (বা ম্যাপড) প্রত্যেকের জন্য ডেটা অ্যাক্সেসযোগ্য রেখে দেয় ;

  2. আপডেট করা সামগ্রী সহ একটি নতুন ফাইল তৈরি করা হচ্ছে।

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

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


6

আরপিএম আপগ্রেড একই কাজ করে - বাইনারিগুলি এবং লাইব্রেরিগুলি চালিত করে যখন কিছুই ক্র্যাশ হয় না।

তাহলে পার্থক্য টা কি:

  1. ফাইলটি লিঙ্কমুক্ত করুন
  2. একই নামে নতুন ফাইল লিখুন

এটি ফাইলের স্থানটি প্রতিস্থাপন করবে না: ব্যবহারযোগ্য-বাইনারিটি উল্লেখ করে এমন ইনোডটি শেষ ব্যতীত এটি উন্মুক্ত না হওয়া অবধি "ব্যস্ত" থাকে। নতুন ফাইলটি একটি নতুন ইনোড-নম্বর দিয়ে তৈরি করা হবে।

এখন scpবা cpফাইলটি স্থানের জায়গায় প্রতিস্থাপন করার চেষ্টা করবে - যা ইনোড উল্লেখ করে এমন সামগ্রী পরিবর্তন করবে। এটি কার্যকর হয় না - যেমন আপনি বর্ণনা করেছেন।

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