স্টার্ট-স্টপ-ডিমন এবং & দিয়ে চলার মধ্যে পার্থক্য কী?


18

আমি /etc/init.d তে একটি পরিষেবা স্থাপন করছি। আমি সেখানে বিভিন্ন স্ক্রিপ্টগুলি দেখছি, কিছুগুলি প্রয়োগ করা হয় start-stop-daemon ...এবং কিছু দিয়ে /path/to/script &

তারা সকলেই একটি ফাইলের মধ্যে পিড সংরক্ষণ করে এবং কিছু চেক করে।

সেরা অনুশীলন কোনটি, পার্থক্যগুলি কী কী, এখানে জানা গুরুত্বপূর্ণ কী ...? (সাধারণভাবে)

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

ধন্যবাদ

উত্তর:


27

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

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

একটি ডিমন - যেমন ডি.ডি দ্বারা স্বয়ংক্রিয়ভাবে শুরু হয়েছিল, তবে এটি কোনও টার্মিনাল থেকে ম্যানুয়ালি শুরু করা যেতে পারে - অন্যদিকে, কোনও টার্মিনাল থেকে সংযোগ বিচ্ছিন্ন হয়। এমনকি যদি এটি ম্যানুয়ালি একটি টার্মিনাল থেকে শুরু করা হয়েছিল, ডেমোনটি টার্মিনাল থেকে সংযোগ বিচ্ছিন্ন হয়ে যাবে, সুতরাং এটি না লিখতে পারে (stdout, stderr) এবং না পড়তে পারে (স্টাডিন)। এটি টার্মিনাল দ্বারা "স্বয়ংক্রিয়ভাবে" প্রেরিত সংকেতগুলিতে "প্রতিরোধ ক্ষমতা"। (যদিও আপনি এটি ব্যবহার করে সংকেত পাঠাতে পারেন kill -signal pid)।

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

আপনি যদি psবিকল্পগুলি ব্যবহার করে যা কোনও প্রক্রিয়াটি কোন টার্মিনালটি ব্যবহার করে তা দেখায়, আপনি দেখতে পাবেন যে আগাম এবং পটভূমি উভয়ই একটি টার্মিনাল (যেমন tty2) এর সাথে জড়িত। অন্যদিকে ডেমনস, একটি "আছে?" এই ক্ষেত্রে.

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

আরেকটি বিষয় হল সর্বাধিক ডেমনগুলি কীভাবে কাজ করে। একটি ডেমন সাধারণত একক এক্সিকিউটেবল যা দুটি স্বতন্ত্র মোডের মধ্যে একটিতে চলতে পারে; এটি আসল ডেমন - পিতামাতা - বুট থেকে শুরু হয়েছিল বা ম্যানুয়ালি ... বা এই পিতামাতার দ্বারা উত্পন্ন একটি শিশু কিনা তার উপর নির্ভর করে। অভিভাবক-প্রক্রিয়াটি সাধারণত কিছু ইভেন্টের জন্য বসে থাকে এবং অপেক্ষা করে - একটি নির্দিষ্ট সময়, সময় পার হয়ে যায়, একটি নির্দিষ্ট নেটওয়ার্ক পোর্টের সাথে সংযোগ স্থাপনের চেষ্টা, বা যা কখনও। যখন এটি ঘটে, পিতা-মাতা নিজের মতো একটি শিশু-প্রক্রিয়া তৈরি করেন (কাঁটাচামচ () সিস্টেম-কল ব্যবহার করে) - এবং তত্ক্ষণাত অন্য ইভেন্টের জন্য অপেক্ষা করতে ফিরে যায় (এবং আরও বেশি শিশু জন্মায়)। এটি শিশু-প্রক্রিয়া যা আসলে কাজ করবে - যেমন একটি ডিস্ক সিঙ্ক করা, একটি কমান্ড চালানো (উদাহরণস্বরূপ cron) বা একটি নেটওয়ার্ক-সংযোগ স্থাপন করা (যেমন sshdবাftpd)। পিতা-মাতার এবং সন্তানের মধ্যে পার্থক্য কেবল হ'ল তারা আলাদা আলাদা পিআইডি পেয়েছে এবং সন্তানের পিপিআইডি (পিতামাতার-পিআইডি) হ'ল পিতা-মাতার প্রক্রিয়াটির পিআইডি - এটি প্রক্রিয়াটি পিতামাতা বা সন্তানের কিনা তা বোঝাতে ব্যবহৃত হতে পারে। সুতরাং একই প্রক্রিয়াটি অবশ্যই দুটি পদ্ধতিতে পরিচালনা করতে সক্ষম হবে - অপেক্ষমান (এবং ফুঁকিয়ে) পিতা বা মাতা হিসাবে, বা একটি শ্রমজীবী ​​শিশু হিসাবে।

ডেমন লিখতে অসুবিধা না হলেও এটি তুচ্ছ নয় - যেমন আপনি দেখেন বেশ কয়েকটি "কৌশল" আপনার অবশ্যই জানা উচিত। সাধারণভাবে, আমি ভাবি যে ডিমন লেখার জন্য অন্যান্য বিকল্পের তুলনায় খুব অল্প লাভের জন্য প্রচুর প্রচেষ্টা প্রয়োজন:

ব্যাকগ্রাউন্ড-জব ব্যবহার করা nohupবা ব্যবহার disownকরা সাধারণত একটি ভাল যথেষ্ট বিকল্প কারণ এটি টার্মিনালটি বন্ধ হয়ে গেলেও প্রক্রিয়াটি বাঁচিয়ে রাখে। Stdout এবং stderr কোনও ফাইলে বা / dev / null এ পুনঃনির্দেশ করা প্রায়শই ভাল ধারণা। আরও ইন্টারেক্টিভ প্রোগ্রামগুলির জন্য, screenআপনার প্রয়োজন না হওয়া পর্যন্ত কিছু "দূরে" রাখার একটি ভাল উপায়। at, batchএবং crontabকৌতূহলোদ্দীপক মূল্যবান।


1
এছাড়াও আমি আমার পুরানো ইউনিক্স সিস্টেম কোর্সগুলি থেকে মনে রেখেছি, টার্মিনাল থেকে চালু করার সময় সার্ভারকে অবশ্যই তার [প্রক্রিয়া দল] [ en.wikedia.org/wiki/Process_group] ছেড়ে যেতে হবে । আমি যত দূর মনে করতে পারি. যাতে প্রক্রিয়াটি তার মূল টার্মিনাল থেকে কোনও সংকেত প্রতিরোধ করে।
yves বাউমস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.