উত্তর:
একটি মাছ বা সাইকেল আরও ভাল কি? nohupএবং execবিভিন্ন জিনিস।
execঅন্য প্রোগ্রামের সাথে শেলটি প্রতিস্থাপন করে। execএকটি সাধারণ ব্যাকগ্রাউন্ড জব ব্যবহার করা কার্যকর নয়: exec myprogram; more stuffশেলটি প্রতিস্থাপন করে myprogramএবং তাই চালায় না more stuff, myprogram; more stuffযা শেষ more stuffহওয়ার পরে চলে myprogram; কিন্তু exec myprogram & more stuffশুরু হয় myprogramপটভূমিতে এবং তারপর রান more stuff, ঠিক এরকমই myprogram & more stuff।
nohupSIGHUP সিগন্যাল উপেক্ষা করে নির্দিষ্ট প্রোগ্রামটি চালায়। যখন একটি টার্মিনাল বন্ধ থাকে, কার্নেল সেই টার্মিনালটিতে নিয়ন্ত্রণ প্রক্রিয়াতে (যেমন শেল) SIGHUP প্রেরণ করে। পরিবর্তে শেলটি ব্যাকগ্রাউন্ডে চলমান সমস্ত কাজের জন্য SIGHUP প্রেরণ করে। nohupটার্মিনালটি যদি মারা যায় (তবে এটি ঘটে যেমন আপনি দূরবর্তীভাবে লগইন করেছেন এবং সংযোগটি হ্রাস পেয়েছে, অথবা যদি আপনি আপনার টার্মিনাল এমুলেটরটি বন্ধ করেন) তবে কোনও কাজ চালানো এইভাবে মারা যাওয়ার হাত থেকে বাঁচায়।
nohupপ্রোগ্রামের আউটপুটটিকেও ফাইলে পুনঃনির্দেশ করে nohup.out। এটি প্রোগ্রামটি মারা যাওয়া এড়ায় কারণ এটি এর আউটপুট বা ত্রুটি আউটপুটটিতে লিখতে সক্ষম নয়। নোট যে nohupইনপুট পুনর্নির্দেশ না। আপনি যে প্রোগ্রামটি চালু করেছেন সেখান থেকে কোনও প্রোগ্রাম পুরোপুরি সংযোগ বিচ্ছিন্ন করতে, ব্যবহার করুন
nohup myprogram </dev/null >myprogram.log 2>&1 &
exec firefox, শেলটি আর চলবে না: এটি দ্বারা প্রতিস্থাপন করা হয়েছে firefox। আপনি execকোনও প্রোগ্রাম থেকে বেরিয়ে আসা এবং একটি নতুন প্রোগ্রাম শুরু করার বিষয়ে ভাবতে পারেন তবে একই প্রক্রিয়া আইডি রাখছেন। টার্মিনাল চলমান কারণ কিছুই এটা বলা বন্ধ করতে রাখে। আপনি যখন পরে ফায়ারফক্স থেকে প্রস্থান করবেন, firefoxপ্রক্রিয়াটি সমাপ্ত হবে। টার্মিনালটি লক্ষ্য করে যে এটির শিশু প্রক্রিয়াটি শেষ হয়ে গেছে এবং ফলস্বরূপ এটি প্রস্থান করে।
exec & => ব্যাকগ্রাউন্ড প্রক্রিয়া হিসাবে একটি প্রক্রিয়া চালায় যাতে আপনি অন্যান্য কাজের জন্য একই টার্মিনাল ব্যবহার চালিয়ে যেতে পারেন।
nohup => সমস্ত SIGHUP এড়িয়ে যায় (সিগন্যাল সমাপ্ত) এবং আপনি টার্মিনালটি বন্ধ থাকলেও কার্যকর করা চালিয়ে যান।
execপ্রক্রিয়াটি যখন SIGHUPপ্রাপ্ত হয় তখন মারা যায় , তবে nohupপ্রক্রিয়া অবিরত থাকে।
execচলমান প্রক্রিয়াটি প্রতিস্থাপন করে তবে আপনি &এক্সিকিউড কমান্ডের পটভূমি ব্যবহার করার সময় এমনটি মনে হয় না । বাশ বা জেডএস-এ নয়।
exec smth &কি হয় (exec smth) &যা হচ্ছে না?
(exec smth) &। তবে আমি এটি একই হওয়ার আশা করব না - আমি এটি একটি সিনট্যাক্স ত্রুটি হিসাবে প্রত্যাশা করব, আপনি কীভাবে কোনও প্রক্রিয়া সম্পাদন করতে পারেন (নিজেকে প্রতিস্থাপন করে) এবং তারপরে কার্যকর হওয়া প্রক্রিয়াটির ব্যাকগ্রাউন্ড করবেন? আপনি আর এটি করার জন্য নেই।
কমান্ড-এ নির্মিত শেলটি exec <command>শেলের সাথে প্রতিস্থাপন করে <command>, কোনও নতুন প্রক্রিয়া নেই, কোনও নতুন পিআইডি তৈরি হয় না। <command>সাধারণত সম্পূর্ণ হওয়ার পরে আপনার টার্মিনালটি বন্ধ হয়ে যাবে। এটিকে ব্যাকগ্রাউন্ডে চালিয়ে প্রথমে একটি সাব-শেল তৈরি করা হয়, যা পরে একইভাবে অবিলম্বে প্রতিস্থাপন করা হয় <command>।
nohup <command> কমান্ড চালানো হবে <command>কিন্তু immume hangups (-s 1 বধ) তাই যখন শেল, টার্মিনাল থেকে তা শুরু হয়েছিল হয়, বন্ধ করা হয় এটা সমাপ্ত করা হবে না। এটি ব্যাকগ্রাউন্ডে চালিয়ে প্রথমে একটি সাব-শেল তৈরি করা হয় এবং কমান্ডটি পটভূমিতে সঞ্চালিত হয়, আপনাকে প্রম্পটে প্রত্যাবর্তন করে।
স্ক্রিপ্টিং-এ তাত্ক্ষণিক প্রভাব কমবেশি একই রকম হয়, যদিও <command>আপনার স্ক্রিপ্ট দ্বারা শুরু হয় এবং স্ক্রিপ্টটি <command>শুরু হওয়ার অপেক্ষা রাখে না , আউটপুট প্রেরণ বা সম্পূর্ণ না করেই চলতে থাকবে ।
script.sh &বা করার মধ্যে কেবল একটি সামান্য পার্থক্য দেখতে পাচ্ছি exec script.sh &। উভয় ক্ষেত্রেই কমান্ডটি শিশু প্রক্রিয়াতে কার্যকর করা হয়, এটি কলিং প্রক্রিয়াটি প্রতিস্থাপন করে না, দেখুন: পেস্ট.এলকন.আর.৪৪৪৪৪৪ (এখানে একটি মন্তব্যে এটি অনুলিপি করার পক্ষে খুব দীর্ঘ ...)। আমি কি ভুল করছি?
আপনি তুলনা করতে পারবেন না nohupসঙ্গে exec। আপনি যখন সাথে এক্সিকিউটেবল চালাবেন nohup, আপনি লগআউট করার সময় (ssh অধিবেশন) প্রক্রিয়াটি মারা যাবে না; সাধারণত কম অগ্রাধিকারে প্রক্রিয়া চালাতে nohupব্যবহৃত হয় nice। HUPসংকেত কনভেনশন দ্বারা, যেভাবে একটি টার্মিনাল লগ-আউট এর নির্ভরশীল প্রসেস সতর্ক করা হয়