जवाबों:
क्या बेहतर है, एक मछली या एक साइकिल? 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
।
nohup
Sightup संकेत के साथ विशिष्ट प्रोग्राम चलाता है पर ध्यान नहीं दिया। जब कोई टर्मिनल बंद हो जाता है, तो कर्नेल उस टर्मिनल (यानी शेल) में नियंत्रण प्रक्रिया के लिए SIGHUP भेजता है। बदले में शेल पृष्ठभूमि में चल रही सभी नौकरियों के लिए SIGHUP भेजता है। nohup
यदि टर्मिनल मर जाता है (जो कि यदि आप दूरस्थ रूप से लॉग इन किया गया था और कनेक्शन ड्रॉप हो जाता है, या यदि आप अपने टर्मिनल एमुलेटर को बंद कर देते हैं, तो उदाहरण के लिए ऐसा होता है) यदि इस तरह से इसे चलाने के साथ नौकरी चलती है, तो इसे इस तरह से मारा जाता है।
nohup
फ़ाइल में प्रोग्राम के आउटपुट को रीडायरेक्ट भी करता है nohup.out
। यह प्रोग्राम को मरने से बचाता है क्योंकि यह अपने आउटपुट या एरर आउटपुट में लिखने में सक्षम नहीं है। ध्यान दें कि nohup
इनपुट पुनर्निर्देशित नहीं करता है। टर्मिनल से एक प्रोग्राम को पूरी तरह से डिस्कनेक्ट करने के लिए जहां आपने इसे लॉन्च किया था, उपयोग करें
nohup myprogram </dev/null >myprogram.log 2>&1 &
exec firefox
, शेल अब नहीं चल रहा है: इसे बदल दिया गया है firefox
। आप exec
एक कार्यक्रम से बाहर निकलने और एक नई शुरुआत करने के बारे में सोच सकते हैं , लेकिन एक ही प्रक्रिया आईडी रखते हुए। टर्मिनल चल रही है क्योंकि कुछ भी नहीं बताया रोकने के लिए रहता है। जब आप बाद में फ़ायरफ़ॉक्स से बाहर निकलते हैं, तो firefox
प्रक्रिया समाप्त हो जाती है। टर्मिनल ने नोटिस किया कि इसकी बाल प्रक्रिया बाहर निकल चुकी है और इसलिए यह बदले में बाहर निकलता है।
exec &
=> एक प्रक्रिया को एक पृष्ठभूमि प्रक्रिया के रूप में निष्पादित करता है ताकि आप अन्य नौकरियों के लिए एक ही टर्मिनल का उपयोग जारी रख सकें।
nohup
=> सभी साइटअप (सिग्नल को समाप्त) से बचा जाता है और टर्मिनल बंद होने पर भी निष्पादन जारी रखता है।
exec
जब एक SIGHUP
प्राप्त होता है तो प्रक्रिया मर जाती है, लेकिन nohup
प्रक्रिया जारी रहती है।
exec
पर चल रही प्रक्रिया को बदल देता है, लेकिन ऐसा तब नहीं होता जब आप &
निष्पादन कमांड को पृष्ठभूमि में लेते हैं। न बैश में और न ही zsh में।
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 &
। दोनों मामलों में कमांड को एक चाइल्ड प्रोसेस में निष्पादित किया जाता है, यह कॉलिंग प्रक्रिया को प्रतिस्थापित नहीं करता है, देखें: paste.alacon.org/44474 (टिप्पणी में इसे कॉपी करने के लिए बहुत लंबा ...)। मैं क्या गलत कर रहा हूं?
आप तुलना नहीं कर सकते nohup
के साथ exec
। जब आप किसी निष्पादन योग्य को चलाते हैं nohup
, तो जब आप लॉगआउट (ssh सत्र) करते हैं तो यह प्रक्रिया नहीं मारी जाएगी; आमतौर पर कम प्राथमिकता पर प्रक्रियाओं को चलाने के लिए nohup
उपयोग किया जाता nice
है। HUP
संकेत, प्रथा के अनुसार, जिस तरह से एक टर्मिनल लॉगआउट की निर्भर प्रक्रियाओं ने चेतावनी दी है