কেন "su -c <কম্যান্ড> &" আপাতদৃষ্টিতে কোনও আদেশকে হ্যাংড আপ না করে পটভূমিতে চালানোর অনুমতি দেয়


11

আমি এমন একজন সহকর্মীকে সহায়তা করছিলাম যিনি একটি পটভূমি প্রক্রিয়াটি মাঝেমধ্যে মারা যাচ্ছিল with

আমি আবিষ্কার করেছি যে তারা সার্ভারে লগ ইন করে এবং সম্পাদন করে পটভূমি প্রক্রিয়া শুরু করেছিল:

su - <user> -c '<command>' &

"আহা", আমি চিৎকার করে উঠলাম। "যদি আপনি" এবং "দিয়ে কোনও কমান্ড শুরু করেন তবে আপনি নিয়ন্ত্রণকারী টার্মিনালটি থেকে প্রস্থান করার সময় এটি ঝুলবে।

আমি আমার পয়েন্টটি প্রদর্শন করার জন্য উপরের কমান্ডটি পরীক্ষা করেছি এবং ... এটি মনে হচ্ছে কাজ করছে: কমান্ড দ্বারা শুরু হওয়া প্রক্রিয়াটি যখন আমরা টার্মিনালটি উপরের কমান্ডটি চালিত করতাম তখন বের হয় নি।

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

কমান্ডটি চালানো যেমন প্রত্যাশার সাথে আচরণ করে:

<command> &
exit

উপরের ক্ষেত্রে কমান্ড দ্বারা শুরু হওয়া ব্যাকগ্রাউন্ড প্রক্রিয়াটি যখন আমরা টার্মিনাল থেকে প্রস্থান করি তখন প্রস্থান হয়।

আমার প্রশ্নটি হ'ল:

  1. যখন আমরা "su - -c &" যুক্ত করি তখন কী ঘটে থাকে যা আমাদের টার্মিনালটি প্রস্থান করার সময় প্রক্রিয়াটি প্রস্থান হতে বাধা দেয়। আমি কন্ট্রোলিং টার্মিনাল, স্ট্যান্ডার্ড ইনপুট এবং আউটপুট ইত্যাদির বিষয়ে বিস্তারিতভাবে বুঝতে চাই

  2. এটি একটি পটভূমি প্রক্রিয়া হিসাবে এই আদেশটি চালানোর লক্ষ্য অর্জনের যুক্তিসঙ্গত উপায়। তা না হলে কেন?

আমি আমার সংস্থার মধ্যে সেরা অনুশীলনগুলি প্রচার করতে চাই, তবে আমার যে কোনও প্রস্তাবনা রয়েছে তা প্রদর্শন এবং ব্যাক-আপ করতে আমার সক্ষম হওয়া দরকার।

ঠিক কী চলছে তাও আমি বুঝতে চাই।

উত্তর:


12

মারা যাওয়ার টার্মিনালের কারণে কোনও প্রক্রিয়া মারা যাওয়ার বিভিন্ন উপায় রয়েছে।

  1. প্রথম উপায় কার্নেল টার্মিনাল চালক যে একটি SIGHUP সংকেত পাঠায় করতে নিয়ন্ত্রণকারী প্রক্রিয়া , যার জন্য টার্মিনাল নিয়ন্ত্রণকারী টার্মিনাল । বেশিরভাগ ক্ষেত্রে, কন্ট্রোলিং প্রক্রিয়াটি শেল যা প্রাথমিকভাবে টার্মিনালে শুরু হয়েছিল, এবং এর নিয়ন্ত্রণকারী টার্মিনালটিই এটির স্টিডিন, স্টডআউট এবং স্টডার যুক্ত হয় are কোনও প্রক্রিয়া কল করলে এটি নিয়ন্ত্রণকারী টার্মিনাল থেকে সংযোগ বিচ্ছিন্ন হয়ে যায় setsid

  2. দ্বিতীয় উপায়টি হ'ল শেলটি, যখন এটি সিএইচএইচপি গ্রহণ করে, তার সাবপ্রসেসিসগুলিতে সেই সংকেতটি পুনরায় পাঠায় - আরও সুনির্দিষ্টভাবে, এর পটভূমির কাজগুলিতে। কিছু শেলের (কেএস, বাশ, জেডএস) disownশেলটি নির্দিষ্ট কাজের জন্য সাইনআপ না পাঠাতে বলার জন্য একটি বিল্টিন রয়েছে।

  3. যদি টার্মিনালটি চলে যায় এবং কোনও প্রোগ্রাম এটি থেকে পড়ার চেষ্টা করে, তবে এটি ফাইলের শেষ অবস্থার (বা সম্ভবত একটি পটভূমির কাজের জন্য EIO) অবহিত। যদি টার্মিনালটি চলে যায় এবং কোনও প্রোগ্রাম এতে লেখার চেষ্টা করে তবে লিখিতটি একটি EIO ত্রুটির সাথে ফিরে আসে। এর ফলে প্রোগ্রামটি প্রস্থান করতে পারে।

সুতরাং suএখানে কী পরিবর্তন হয় তা হ'ল (২) সাধারণত প্রাথমিক শেলটিকে ব্যাকগ্রাউন্ড কাজটি হ্রাস করতে পারে, তবে যেহেতু সেই ব্যাকগ্রাউন্ড প্রক্রিয়াটি অন্য একজন ব্যবহারকারী হিসাবে চলমান, তাই সংকেত সরবরাহ করা যায় না এবং ব্যাকগ্রাউন্ড প্রক্রিয়াটি চালু থাকে।


আমি রুট ব্যবহারকারীদের করতে দেখেছি chroot --userspec root:root / sh -c "exec some_forever_process" &। জব একই ব্যবহারকারী হিসাবে চলছে, এর nohupআগে বা disownপরে কোনও স্পষ্ট নয় । সুতরাং এই ক্ষেত্রে, কীভাবে এটি সিগন্যালটি মেয়াদে প্রস্থান করার সময় সরবরাহ করা যাবে না?
টোডিয়াস জোহ

@ টোডিয়াসজহো প্রসুমাবলটি some_forever_processচিরকালের জন্য চালানো (ডেমন) তৈরি করার উদ্দেশ্যে তৈরি হয়েছিল এবং তাই টার্মিনাল প্রস্থান থেকে (তার নিজস্ব প্রক্রিয়া গ্রুপে দৌড়ে) সাইনগআপ গ্রহণ থেকে নিজেকে রক্ষা করে।
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

বাশ / লেজ সিগআপের বিরুদ্ধে রক্ষা করে না, তবুও এটি এখনও কাজ করে: R `` স্থানীয় $ এসএসএস রুট @ রিমোট_হোস্ট রিমোট # ক্রোট - ইউজারস্পেক রুট: রুট / শ-সিসি "এক্সিকিউশন বাশ-সি 'লেজ -f / দেব / নাল '"& [1] 6376 রিমোট # PS -p $! - কোন শিরোনাম -o পিড, ইউআইডি, কমান্ড -ww 6376 0 লেজ -f / dev / নাল রিমোট # প্রস্থান করুন স্থানীয় $ এসএসএস রুট @ রিমোট_হোস্ট রিমোট # পিএস-পি 6376 - কোন শিরোনাম-পিড, ইউআইডি, কমান্ড -ww 6376 0 পুচ্ছ -f / dev / নাল `` `
টোডিয়াস ঝো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.