“এক্সিকিউটিভ &” এর পরিবর্তে কেন “নোহআপ ও” ব্যবহার করবেন?


67

আমি জানি যে, nohupবাইনারি হওয়ার কারণে এটি কোনও শেল থেকে পৌঁছানো যায়। তবে execবিল্ট-ইন সম্ভবত প্রতিটি শেলের মধ্যে রয়েছে exists

তাদের মধ্যে একজনকে অপরটির চেয়ে পছন্দ করার কোনও কারণ আছে কি?

উত্তর:


113

একটি মাছ বা সাইকেল আরও ভাল কি? 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 &

27
একটি সাইকেল> একটি মাছ
ক্রিস জয়েনেস

6
আমি আলাদা করতে অনুরোধ। মাছ কার্যকরভাবে পরিবহণের একটি সর্বোত্তম পদ্ধতি এটি প্রয়োগ করা যেতে পারে।
এই ব্যবহারকারীর

6
@ THISUSERNEEDSHELP তবে একটি সাইকেল আরও ভাল খাবার, অবশ্যই?
গিলস

3
@ জিপসিকোসমোনট আপনি চালানোর পরে exec firefox, শেলটি আর চলবে না: এটি দ্বারা প্রতিস্থাপন করা হয়েছে firefox। আপনি execকোনও প্রোগ্রাম থেকে বেরিয়ে আসা এবং একটি নতুন প্রোগ্রাম শুরু করার বিষয়ে ভাবতে পারেন তবে একই প্রক্রিয়া আইডি রাখছেন। টার্মিনাল চলমান কারণ কিছুই এটা বলা বন্ধ করতে রাখে। আপনি যখন পরে ফায়ারফক্স থেকে প্রস্থান করবেন, firefoxপ্রক্রিয়াটি সমাপ্ত হবে। টার্মিনালটি লক্ষ্য করে যে এটির শিশু প্রক্রিয়াটি শেষ হয়ে গেছে এবং ফলস্বরূপ এটি প্রস্থান করে।
গিলস

5
একজনকে একটি মাছ দিন এবং আপনি তাকে একদিনের জন্য খাওয়ান। একজনকে একটি বাইসাইকেল দিন এবং তিনি এটি সুপার মার্কেটে চালাতে এবং আজীবন মাছ কিনতে পারেন।
ডেভিড

18

exec & => ব্যাকগ্রাউন্ড প্রক্রিয়া হিসাবে একটি প্রক্রিয়া চালায় যাতে আপনি অন্যান্য কাজের জন্য একই টার্মিনাল ব্যবহার চালিয়ে যেতে পারেন।

nohup => সমস্ত SIGHUP এড়িয়ে যায় (সিগন্যাল সমাপ্ত) এবং আপনি টার্মিনালটি বন্ধ থাকলেও কার্যকর করা চালিয়ে যান।

execপ্রক্রিয়াটি যখন SIGHUPপ্রাপ্ত হয় তখন মারা যায় , তবে nohupপ্রক্রিয়া অবিরত থাকে।


1
এই উত্তরটি সঠিক বলে মনে হচ্ছে। উপরের অন্যান্য উত্তরগুলি যেমন বলেছে, সাধারণত execচলমান প্রক্রিয়াটি প্রতিস্থাপন করে তবে আপনি &এক্সিকিউড কমান্ডের পটভূমি ব্যবহার করার সময় এমনটি মনে হয় না । বাশ বা জেডএস-এ নয়।
ড্যান প্রিটস 21

@ ড্যানপ্রিটগুলি এর অর্থ কী? একটি ব্যাকগ্রাউন্ড সাবপ্রসেস শুরু হয়ে যায় এবং তারপরে প্রতিস্থাপন করা হয়, ঠিক তেমনই exec smth &কি হয় (exec smth) &যা হচ্ছে না?
পিএইচকে

1
আমি বলতে চাইছি যে এটি আপনি সাধারণত (বর্তমান চলমান শেলটি প্রতিস্থাপন করে) ভাবেন - এই অর্থে এটি কার্যকর হয় না - এটি কেবল একটি পটভূমি প্রক্রিয়া হিসাবে চালিত হয়। আমার ধারণা এটি সম্ভবত একইরকম (exec smth) &। তবে আমি এটি একই হওয়ার আশা করব না - আমি এটি একটি সিনট্যাক্স ত্রুটি হিসাবে প্রত্যাশা করব, আপনি কীভাবে কোনও প্রক্রিয়া সম্পাদন করতে পারেন (নিজেকে প্রতিস্থাপন করে) এবং তারপরে কার্যকর হওয়া প্রক্রিয়াটির ব্যাকগ্রাউন্ড করবেন? আপনি আর এটি করার জন্য নেই।
ড্যান প্রিটস 21

2

কমান্ড-এ নির্মিত শেলটি exec <command>শেলের সাথে প্রতিস্থাপন করে <command>, কোনও নতুন প্রক্রিয়া নেই, কোনও নতুন পিআইডি তৈরি হয় না। <command>সাধারণত সম্পূর্ণ হওয়ার পরে আপনার টার্মিনালটি বন্ধ হয়ে যাবে। এটিকে ব্যাকগ্রাউন্ডে চালিয়ে প্রথমে একটি সাব-শেল তৈরি করা হয়, যা পরে একইভাবে অবিলম্বে প্রতিস্থাপন করা হয় <command>

nohup <command> কমান্ড চালানো হবে <command>কিন্তু immume hangups (-s 1 বধ) তাই যখন শেল, টার্মিনাল থেকে তা শুরু হয়েছিল হয়, বন্ধ করা হয় এটা সমাপ্ত করা হবে না। এটি ব্যাকগ্রাউন্ডে চালিয়ে প্রথমে একটি সাব-শেল তৈরি করা হয় এবং কমান্ডটি পটভূমিতে সঞ্চালিত হয়, আপনাকে প্রম্পটে প্রত্যাবর্তন করে।

স্ক্রিপ্টিং-এ তাত্ক্ষণিক প্রভাব কমবেশি একই রকম হয়, যদিও <command>আপনার স্ক্রিপ্ট দ্বারা শুরু হয় এবং স্ক্রিপ্টটি <command>শুরু হওয়ার অপেক্ষা রাখে না , আউটপুট প্রেরণ বা সম্পূর্ণ না করেই চলতে থাকবে ।


আমিও এক্সিকিউট কি করে সে সম্পর্কে নিশ্চিত নই। আমি বোঝাতে চাইছি ... এটি যা করার কথা তা আমি বুঝতে পেরেছি কিন্তু আমি করার script.sh &বা করার মধ্যে কেবল একটি সামান্য পার্থক্য দেখতে পাচ্ছি exec script.sh &। উভয় ক্ষেত্রেই কমান্ডটি শিশু প্রক্রিয়াতে কার্যকর করা হয়, এটি কলিং প্রক্রিয়াটি প্রতিস্থাপন করে না, দেখুন: পেস্ট.এলকন.আর.৪৪৪৪৪৪ (এখানে একটি মন্তব্যে এটি অনুলিপি করার পক্ষে খুব দীর্ঘ ...)। আমি কি ভুল করছি?
স্টাফেন

2

আপনি তুলনা করতে পারবেন না nohupসঙ্গে exec। আপনি যখন সাথে এক্সিকিউটেবল চালাবেন nohup, আপনি লগআউট করার সময় (ssh অধিবেশন) প্রক্রিয়াটি মারা যাবে না; সাধারণত কম অগ্রাধিকারে প্রক্রিয়া চালাতে nohupব্যবহৃত হয় niceHUPসংকেত কনভেনশন দ্বারা, যেভাবে একটি টার্মিনাল লগ-আউট এর নির্ভরশীল প্রসেস সতর্ক করা হয়

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