চলমান অবস্থায় আমি কি কোনও ব্যাশ স্ক্রিপ্ট (.sh) ফাইলটি সংশোধন করতে পারি?


28

ধরুন আমার কাছে একটি স্ক্রিপ্ট আছে script.shযা কার্যকর করতে কিছুটা সময় নেয়। আমি এটি কার্যকর ./script.sh। এটি যখন টার্মিনাল উইন্ডোতে চলছে তখন আমি ফাইলটি সংশোধন করি script.sh। এটি ইতিমধ্যে চলমান প্রক্রিয়াতে কোনও প্রভাব ফেলবে?

এটি সংশোধন করার পরে, আমি পরিবর্তিত ফাইলটি কার্যকর করি, সুতরাং আমার এখন দুটি চলমান প্রক্রিয়া রয়েছে। এটা ঠিক আছে?


উত্তর:


36

আপনি যখন আপনার স্ক্রিপ্টে পরিবর্তন করেন, আপনি ডিস্কে পরিবর্তনগুলি করেন (হার্ড ডিস্ক- স্থায়ী সঞ্চয়স্থান); আপনি যখন স্ক্রিপ্টটি কার্যকর করেন, স্ক্রিপ্টটি আপনার মেমোরিতে (র‌্যাম) লোড হয়।

সুতরাং, আপনি স্ক্রিপ্টে যে পরিবর্তনগুলি চলমান স্ক্রিপ্টকে প্রভাবিত করবে না, এটি সেই পরিবর্তনগুলি সম্পাদন করার আগে আপনি চালিত সংস্করণটি চালাবেন।

যাইহোক, আপনি যখন আগের চলমান দৃষ্টান্তটি বন্ধ না করে আবার পরিবর্তিত স্ক্রিপ্টটি সম্পাদন করেন, স্ক্রিপ্টের দুটি উদাহরণ থাকবে। একটিতে পরিবর্তনগুলি রয়েছে এবং পুরানোটি।

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

আপডেট: ইউনিক্স.স্ট্যাকেক্সেঞ্জা.কম-এ আরও ভাল উত্তরের দিকে ইশারা করার জন্য নিবন্ধিত ব্যবহারকারীকে ধন্যবাদ Thanks

স্ক্রিপ্টের আকার এবং প্রশ্নে সংকলক / দোভাষীর উপর নির্ভর করে স্ক্রিপ্টটি আংশিক / সম্পূর্ণ লোড করা হবে। সুতরাং, যদি স্ক্রিপ্টটি পুরোপুরি লোড না করা হয়, আপনি স্ক্রিপ্টে যে পরিবর্তনগুলি করেন তা স্ক্রিপ্টের অংশটি মেমরিতে লোড হয়ে যাওয়ার পরে চলমান ঘটনার প্রতিফলন ঘটবে।

সুতরাং, ডিস্কে আপনার স্ক্রিপ্টটি পরিবর্তন করার প্রস্তাব দেওয়া হয় না যা বর্তমানে অনুমানযোগ্য আউটপুট জন্য চলছে: প্রথমে চলমান দৌড় বন্ধ করুন এবং তারপরে আপনার স্ক্রিপ্টটি সংশোধন করুন এবং তারপরে স্ক্রিপ্টটি পুনরায় কার্যকর করুন।



@ নিবন্ধিত ব্যবহারকারী: ওহ হ্যাঁ, এই প্রশ্নটি আমাকে আমার ওএস পাঠের কথা মনে করিয়ে দিয়েছে। আমি আমার ডেস্কটপে হাত দেওয়ার সাথে সাথে আমার উত্তরটি সম্পাদনা করব (এখনই আমার ফোনে)
জবিন

আমার ধারণা শর্ট স্ক্রিপ্টগুলির জন্য কোনও সমস্যা হওয়া উচিত নয়।
বেকো

1
যখন আমি ব্যাশ v3.2.48 ( এখানে দেখুন ) দিয়ে চেষ্টা করেছি , এটি লাইনটির শেষের বাইরে বাফার হয়নি (এবং স্ক্রিপ্টটি সম্পাদন করার সাথে সাথে আমি সংশোধন করার সময় খারাপভাবে ব্যর্থ হয়েছিলাম)। আমি সবেমাত্র bash v4.3.0 দিয়ে প্রতিবেদন করেছি এবং এটি সম্পূর্ণ (সংক্ষিপ্ত) স্ক্রিপ্টটি বাফার করেছে। সুতরাং ... আমি কোনও বিশেষ আচরণের উপর নির্ভর করব না।
গর্ডন ডেভিসন

1
@ নিবন্ধিত ব্যবহারকারী বাশের সমস্ত সংস্করণ সহ নয় - উদাহরণটি আমি সংযুক্ত করেছি।
গর্ডন ডেভিসন

4

আমি এমন কিছু যুক্ত করব যা আমি মনে করি অন্য উত্তরগুলিতে বলা হয়নি। আপনি কীভাবে ফাইলটি সম্পাদনা করবেন তার উপর অনেক কিছুই নির্ভর করে । এরকম echo "stuff" >fileশেল (অন্য উদাহরণস্বরূপ) থেকে প্রকৃতপক্ষে ফাইলটি প্রতিস্থাপন হবে, আমি মনে করি। তবে আপনি যদি উদাহরণস্বরূপ ফাইলটি সম্পাদনা করেন emacsএবং তারপরে সংরক্ষণ করেন, এটি হবে না। পরিবর্তে এখানে সম্পাদক পুরাতন ফাইলটিকে কিছু ব্যাকআপ নামে নাম দেয় (সম্ভবত বাস্তবে পূর্ববর্তী ব্যাকআপটি মুছে ফেলা হয়), এবং তারপরে পরিবর্তিত বাফার সামগ্রীগুলি নতুন ফাইল হিসাবে (এখন প্রকাশিত) পুরানো নামের সাথে লিখুন । যেহেতু স্ক্রিপ্টটি পড়ে শেল (বা অন্য অনুবাদক) প্রায় একবার অবশ্যই ফাইলটি একবার খুলবে, তারপরে এটি ফাইলের নামের সন্ধান ছাড়াই স্বাধীন isএটি খোলার সময় এই ফাইলটির নামের সাথে যুক্ত শারীরিক ডিস্ক ফাইলটি (ইনোড নম্বর দ্বারা চিহ্নিত) পড়া চালিয়ে যায়। সুতরাং এটি ব্লকগুলিতে স্ক্রিপ্টটি পড়লেও (যা বাফারযুক্ত পাঠ্য I / O ব্যবহার করে সবচেয়ে সহজ সমাধান হবে), এটি ফাইলের পুরানো উদাহরণ থেকে লাইনগুলি পড়া চালিয়ে যেতে থাকবে, এটি সম্ভবত আপনার সম্পাদনা দ্বারা পরিবর্তিত হবে না।


+1 আমি আমার সম্পাদক হিসাবে সাবলাইম পাঠ্য ব্যবহার করছি। আপনি কি জানেন যে এটির মতো ফাইলটিরও নামকরণ হয় কিনা emacs?
বেকো

1
আমি মনে করি বেশিরভাগ সম্পাদকরা পুনর্নবীকরণ স্কিমটি ব্যবহার করবেন (এমনকি তাদের ব্যাকআপ সংস্করণ রাখা উচিত নয়) এই ঝুঁকি এড়াতে যে লেখার প্রক্রিয়া চলাকালীন কোনও ক্র্যাশ ঘটলে, পাঠ্যের কোনও অক্ষত সংস্করণ একেবারেই থাকবে না। আপনার সম্পাদকের আচরণ কেমন তা "ls -i" (যা ইনোড নম্বর দেখায়) দিয়ে পরীক্ষা করে দেখতে পারেন।
মার্ক ভ্যান লিউউইন

1

এটি আপডেট করা দরকার, উপরের উত্তরগুলি এখন কেবল আংশিকভাবে সঠিক:

বাশের বর্তমান সংস্করণ সহ, স্ক্রিপ্টটি চলাকালীন ডিস্কে পরিবর্তিতকরণের ফলে ব্যাশগুলি পরিবর্তনগুলিকে মেমরিতে লোড করতে "চেষ্টা" করতে পারে এবং চলমান স্ক্রিপ্টে এগুলি চালিয়ে যায়। যদি আপনার পরিবর্তনগুলি বর্তমানে সম্পাদনকারী লাইনের পরে আসে তবে নতুন লাইনগুলি লোড হবে এবং কার্যকর হবে uted তবে এটি বাশ দ্বারা অনুমান এবং এটি সঠিক বা ভুল হতে পারে।

এটি করার সর্বোত্তম উপায় নিম্নলিখিত ক্রিয়াকলাপগুলির ক্রম: 1) স্ক্রিপ্টটিকে মেমরিতে লোড করুন 2) ডিস্ক থেকে স্ক্রিপ্টটি মুছুন 3) প্রথমে ডিস্ক সংস্করণটি মুছে দিয়ে একটি নতুন স্ক্রিপ্ট ডিস্কে লিখুন, মেমরি সংস্করণটি এতে তার লিঙ্কগুলি হারিয়ে ফেলে যাতে আপনি যখন পদক্ষেপ 3 এ একটি নতুন সংস্করণ সরবরাহ করবেন তখন বাশ দ্বারা কোনও নতুন সামগ্রী মেমরির সংস্করণে লোড করার চেষ্টা করা হবে না।


0

@ জবিনের উত্তরটি সাধারণত সঠিক, তবে আমি যা করতে চাই তার উপর নির্ভর করে অন্য কয়েকটি উত্তর যুক্ত করব।

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

আপনি যদি উড়তে স্ক্রিপ্টের আচরণ করতে চান তবে আপনার আরও একটি কঠিন সমস্যা হয়। আমি আশা করি আপনাকে এটি স্ক্রিপ্টের কোডে তৈরি করতে হবে। বাশ স্ক্রিপ্টগুলি সংকেতগুলি হ্যান্ডেল করতে পারে (উদাহরণস্বরূপ এমন কিছু ধরতে পারে kill -USR1 [pid]) এবং কোনও স্ক্রিপ্ট কিছু কোড পুনরায় লোড করে প্রতিক্রিয়া জানাতে পারে। সুতরাং আপনি যা চান তার কাছাকাছি আপনি কার্যকারিতা পেতে পারেন তবে আপনি কী করছেন তা না জেনে আমি এটি করার কোনও ভাল কারণ দেখছি না এবং আমি সন্দেহ করি যে আপনি যদি এই জটিল কিছু করতে চান তবে সম্ভবত আপনি আরও পরিশীলিত চান প্রোগ্রামিং ভাষা এটি করতে।

যদি আপনি এই মনে না রেখে চলমান স্ক্রিপ্টের আচরণটি হ্যাক করতে চান তবে আপনি ভাগ্য থেকে দূরে। আমি কোনও প্রোগ্রামিং টাস্ককে অসম্ভব বলে ডাকতে দ্বিধা করব, তবে এই ধরণের কাজের জন্য যদি আপনার সংস্থান এবং দক্ষতা থাকে তবে আপনি সম্ভবত এখানে জিজ্ঞাসা করবেন না।

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