আসুন প্রথমে দেখে নেওয়া যাক যদি কোনও প্রোগ্রাম কোনও ইন্টারেক্টিভ শেল থেকে শুরু হয় (কোনও টার্মিনালের সাথে সংযুক্ত) ছাড়া &(এবং কোনও পুনর্নির্দেশ ছাড়াই)। সুতরাং ধরে নেওয়া যাক আপনি সবেমাত্র টাইপ করেছেন foo:
- প্রক্রিয়া চলমান
fooতৈরি করা হয়।
- প্রক্রিয়াটি শেল থেকে স্ট্ডিন, স্টডআউট এবং স্ট্ডারকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়। সুতরাং এটি একই টার্মিনালের সাথেও সংযুক্ত is
- শেলটি যদি একটি পায় তবে
SIGHUPএটি SIGHUPপ্রক্রিয়াতে একটি প্রেরণ করে (যা সাধারণত প্রক্রিয়াটি শেষ করে দেয়)।
- অন্যথায় প্রক্রিয়াটি শেষ না হওয়া পর্যন্ত শেলটি অপেক্ষা করে (অবরুদ্ধ)।
এখন, আসুন আমরা কীভাবে প্রক্রিয়াটিকে ব্যাকগ্রাউন্ডে রাখি তা হল দেখুন foo &:
- প্রক্রিয়া চলমান
fooতৈরি করা হয়।
- প্রক্রিয়াটি শেল থেকে স্টাডাউট / স্টডারার উত্তরাধিকার সূত্রে প্রাপ্ত হয় (সুতরাং এটি এখনও টার্মিনালে লিখেছে)।
- নীতিগতভাবে প্রক্রিয়াটি স্ট্ডিনের উত্তরাধিকার সূত্রে প্রাপ্ত হয়, তবে এটি স্টিডিনের কাছ থেকে পড়ার চেষ্টা করার সাথে সাথে এটি বন্ধ হয়ে যায়।
- এটি শেল পরিচালনা করে এমন ব্যাকগ্রাউন্ড কাজের তালিকায় রাখে, যার অর্থ বিশেষত:
- এটি তালিকাভুক্ত
jobsএবং ব্যবহার করে অ্যাক্সেস করা যায় %n( nকাজের নম্বরটি কোথায় )।
- এটি ব্যবহার করে অগ্রভাগের জবতে রূপান্তর করা যেতে পারে
fg, এটির ক্ষেত্রে এটি এমনভাবে চলতে থাকে যেন আপনি &এটি ব্যবহার না করেন (এবং যদি স্ট্যান্ডার্ড ইনপুট থেকে পড়ার চেষ্টা করার কারণে এটি বন্ধ হয়ে যায় তবে এটি এখন টার্মিনাল থেকে পড়তে পারে)।
- শেলটি যদি
SIGHUPএকটি SIGHUPপেয়ে থাকে তবে এটি প্রক্রিয়াতে একটি প্রেরণ করে। শেলের উপর নির্ভর করে এবং সম্ভবত শেলের জন্য নির্ধারিত বিকল্পগুলির উপর নির্ভর করে, শেলটি শেষ SIGHUPকরার সময় এটি প্রক্রিয়াতে একটি প্রেরণও প্রেরণ করবে ।
এখন disownশেলের কাজের তালিকা থেকে কাজটি সরিয়ে দেয়, সুতরাং উপরের সমস্ত উপ-পয়েন্টগুলি আর প্রয়োগ করে না ( SIGHUPশেল দ্বারা প্রক্রিয়াটি প্রেরণ করা সহ )। তবে মনে রাখবেন যে এখনও টার্মিনাল সাথে সংযুক্ত করা হয়, তাই যদি টার্মিনাল ধ্বংস করা হয় (যদি এটি একটি Pty ছিল, দ্বারা নির্মিত মত যা ঘটতে পারে xtermবা ssh, এবং নিয়ন্ত্রণকারী প্রোগ্রাম সমাপ্ত করা হয়ে থাকে xterm ক্লোজিং বা সসীম দ্বারা, , SSH সংযোগ) , প্রোগ্রামটি স্ট্যান্ডার্ড ইনপুট থেকে পড়ার বা স্ট্যান্ডার্ড আউটপুটে লেখার চেষ্টা করার সাথে সাথে ব্যর্থ হবে।
কি nohupকরে, অন্য দিকে, কার্যকরভাবে টার্মিনাল থেকে প্রক্রিয়া আলাদা করা:
- এটি স্ট্যান্ডার্ড ইনপুটটি বন্ধ করে দেয় (প্রোগ্রামটি কোনও অগ্রভাগে চালিত হওয়া সত্ত্বেও কোনও ইনপুট পড়তে সক্ষম হবে না it এটি থামানো হয়নি, তবে একটি ত্রুটি কোড গ্রহণ করবে বা
EOF)।
- এটি স্ট্যান্ডার্ড আউটপুট এবং ফাইলে স্ট্যান্ডার্ড ত্রুটি পুনর্নির্দেশ করে
nohup.out, সুতরাং প্রোগ্রামটি স্ট্যান্ডার্ড আউটপুটটিতে লেখার জন্য ব্যর্থ হবে না যদি টার্মিনাল ব্যর্থ হয়, তাই প্রক্রিয়াটি যা লিখবে তা হারিয়ে যায় নি।
- এটি প্রক্রিয়াটিকে
SIGHUP(যেমন নাম) পেতে বাধা দেয় ।
লক্ষ্য করুন nohupনেই না শেল কাজ নিয়ন্ত্রণ থেকে প্রক্রিয়া অপসারণ এবং ব্যাকগ্রাউন্ডে এটা করা না (কিন্তু সাল থেকে ফোরগ্রাউন্ড nohupকাজ বেশী বা কম বেহুদা হয়, তাহলে আপনি সাধারণত এটা পটভূমি মধ্যে ব্যবহার করা চাই &)। উদাহরণস্বরূপ, এর সাথে disownঅসদৃশভাবে, শেলটি তখনও আপনাকে জানাবে যখন নোহুপ কাজটি শেষ হয়ে যায় (যদি না শেলের আগে শেষ করা হয় তবে অবশ্যই)।
সুতরাং সংক্ষেপে:
& কাজটিকে পটভূমিতে রাখে, এটি ইনপুটটি পড়ার চেষ্টা করতে বাধা দেয় এবং শেলটি এর সমাপ্তির জন্য অপেক্ষা না করে তোলে।
disownশেলের কাজ নিয়ন্ত্রণ থেকে প্রক্রিয়াটি সরিয়ে দেয়, তবে এটি এখনও টার্মিনালের সাথে সংযুক্ত রাখে। ফলাফলগুলির মধ্যে একটি শেল এটি প্রেরণ করবে না SIGHUP। স্পষ্টতই, এটি কেবল ব্যাকগ্রাউন্ড জবগুলিতে প্রয়োগ করা যেতে পারে, কারণ যখন কোনও পূর্বের কাজ চলছে তখন আপনি এটি প্রবেশ করতে পারবেন না।
nohupটার্মিনাল থেকে প্রক্রিয়া সংযোগ বিচ্ছিন্ন, তার আউটপুট পুননির্দেশনা nohup.outএবং এ থেকেই ঢাল SIGHUP। এর মধ্যে একটি প্রভাব (নামকরণ) এটি প্রক্রিয়াটি কোনও প্রেরিতকে গ্রহণ করবে না SIGHUP। এটি চাকরি নিয়ন্ত্রণ থেকে সম্পূর্ণ স্বাধীন এবং নীতিগতভাবে অগ্রভাগের কাজের জন্যও ব্যবহার করা যেতে পারে (যদিও এটি খুব কার্যকর নয়)।