क्यों "निष्पादित और" के बजाय "nohup और" का उपयोग करें


67

मुझे पता है कि, nohupएक बाइनरी होने के नाते, इसे किसी भी शेल से पहुँचा जा सकता है। लेकिन execअंतर्निहित हर खोल में मौजूद है।

क्या उनमें से एक को पसंद करने का एक कारण है, दूसरे को?

जवाबों:


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

nohupSightup संकेत के साथ विशिष्ट प्रोग्राम चलाता है पर ध्यान नहीं दिया। जब कोई टर्मिनल बंद हो जाता है, तो कर्नेल उस टर्मिनल (यानी शेल) में नियंत्रण प्रक्रिया के लिए SIGHUP भेजता है। बदले में शेल पृष्ठभूमि में चल रही सभी नौकरियों के लिए SIGHUP भेजता है। nohupयदि टर्मिनल मर जाता है (जो कि यदि आप दूरस्थ रूप से लॉग इन किया गया था और कनेक्शन ड्रॉप हो जाता है, या यदि आप अपने टर्मिनल एमुलेटर को बंद कर देते हैं, तो उदाहरण के लिए ऐसा होता है) यदि इस तरह से इसे चलाने के साथ नौकरी चलती है, तो इसे इस तरह से मारा जाता है।

nohupफ़ाइल में प्रोग्राम के आउटपुट को रीडायरेक्ट भी करता है nohup.out। यह प्रोग्राम को मरने से बचाता है क्योंकि यह अपने आउटपुट या एरर आउटपुट में लिखने में सक्षम नहीं है। ध्यान दें कि nohupइनपुट पुनर्निर्देशित नहीं करता है। टर्मिनल से एक प्रोग्राम को पूरी तरह से डिस्कनेक्ट करने के लिए जहां आपने इसे लॉन्च किया था, उपयोग करें

nohup myprogram </dev/null >myprogram.log 2>&1 &

27
एक साइकिल> एक मछली
क्रिस जेन्स

6
क्षमा करें मैं असहमत हूं। मछली स्पष्ट रूप से परिवहन का एक बेहतर तरीका है अगर इसे लागू किया जा सकता है।
यह

6
@THISUSERNEEDSHELP लेकिन एक साइकिल बेहतर भोजन है, निश्चित रूप से?
गाइल्स

3
@GypsyCosmonaut आपके द्वारा चलाए जाने के बाद exec firefox, शेल अब नहीं चल रहा है: इसे बदल दिया गया है firefox। आप execएक कार्यक्रम से बाहर निकलने और एक नई शुरुआत करने के बारे में सोच सकते हैं , लेकिन एक ही प्रक्रिया आईडी रखते हुए। टर्मिनल चल रही है क्योंकि कुछ भी नहीं बताया रोकने के लिए रहता है। जब आप बाद में फ़ायरफ़ॉक्स से बाहर निकलते हैं, तो firefoxप्रक्रिया समाप्त हो जाती है। टर्मिनल ने नोटिस किया कि इसकी बाल प्रक्रिया बाहर निकल चुकी है और इसलिए यह बदले में बाहर निकलता है।
गिल्स

5
एक आदमी को एक मछली दें और आप उसे एक दिन के लिए खिलाएं। एक आदमी को एक साइकिल दें और वह इसे सुपरमार्केट में सवारी कर सकता है और जीवन भर के लिए मछली खरीद सकता है।
डेविड

18

exec & => एक प्रक्रिया को एक पृष्ठभूमि प्रक्रिया के रूप में निष्पादित करता है ताकि आप अन्य नौकरियों के लिए एक ही टर्मिनल का उपयोग जारी रख सकें।

nohup => सभी साइटअप (सिग्नल को समाप्त) से बचा जाता है और टर्मिनल बंद होने पर भी निष्पादन जारी रखता है।

execजब एक SIGHUPप्राप्त होता है तो प्रक्रिया मर जाती है, लेकिन nohupप्रक्रिया जारी रहती है।


1
यह उत्तर सही प्रतीत होता है। जैसा कि ऊपर दिए गए अन्य उत्तर कहते हैं, आम तौर execपर चल रही प्रक्रिया को बदल देता है, लेकिन ऐसा तब नहीं होता जब आप &निष्पादन कमांड को पृष्ठभूमि में लेते हैं। न बैश में और न ही zsh में।
21

@DanPritts क्या मतलब है आपके साथ ऐसा नहीं होता है? एक बैकग्राउंड सबप्रोसेस शुरू हो जाता है और फिर बदल दिया जाता है, तो exec smth &जैसा है वैसा ही (exec smth) &नहीं है, क्या हो रहा है?
phk

1
मेरा मतलब है कि इसे उस अर्थ में क्रियान्वित नहीं किया जा सकता है जिसे आप सामान्य रूप से वर्तमान चल रहे शेल के स्थान पर सोचेंगे - यह सिर्फ एक पृष्ठभूमि प्रक्रिया के रूप में चलती है। मुझे लगता है कि यह शायद के रूप में ही है (exec smth) &। लेकिन मैं इसे समान होने की उम्मीद नहीं करूंगा - मुझे उम्मीद है कि यह एक सिंटैक्स त्रुटि होगी, आप एक प्रक्रिया को कैसे निष्पादित कर सकते हैं (अपने आप को बदलकर) और फिर निष्पादन की प्रक्रिया को पृष्ठभूमि देंगे? आप इसे अब और करने के लिए नहीं हैं।
21

2

कमांड में बनाया exec <command>गया शेल शेल को बदल देता है <command>, कोई नई प्रक्रिया नहीं, कोई नई पीआईडी ​​नहीं बनाई गई है। <command>आम तौर पर पूरा होने के बाद आपका टर्मिनल बंद हो जाएगा। इसे बैकग्राउंड में चलाने से पहले एक सबशेल बनाया जाता है, जिसे फिर उसी तरह तुरंत बदल दिया जाता है <command>

nohup <command> आदेश चला जाएगा <command>लेकिन immume hangups (-s 1 मारने) के लिए तो जब खोल, टर्मिनल जिसमें से यह शुरू किया गया था है, बंद कर दिया है इसे समाप्त नहीं किया जाएगा। इसे बैकग्राउंड में चलाने से सबसे पहले एक सबशेल बन जाता है और बैकग्राउंड में कमांड रन करता है, जो आपको प्रॉम्प्ट पर लौटाता है।

स्क्रिप्टिंग में तत्काल प्रभाव कमोबेश ऐसा ही होता है, हालांकि <command>आपकी स्क्रिप्ट द्वारा शुरू किया गया है और स्क्रिप्ट <command>शुरू होने, आउटपुट भेजने या पूरा करने के लिए इंतजार किए बिना जारी रहेगी ।


मुझे भी इस पर यकीन नहीं है कि अमल क्या होता है। मेरा मतलब है ... मैं समझता हूं कि यह क्या करना है लेकिन मैं केवल करने script.sh &या करने के बीच मामूली अंतर देख सकता हूं exec script.sh &। दोनों मामलों में कमांड को एक चाइल्ड प्रोसेस में निष्पादित किया जाता है, यह कॉलिंग प्रक्रिया को प्रतिस्थापित नहीं करता है, देखें: paste.alacon.org/44474 (टिप्पणी में इसे कॉपी करने के लिए बहुत लंबा ...)। मैं क्या गलत कर रहा हूं?
स्टीफन

2

आप तुलना नहीं कर सकते nohupके साथ exec। जब आप किसी निष्पादन योग्य को चलाते हैं nohup, तो जब आप लॉगआउट (ssh सत्र) करते हैं तो यह प्रक्रिया नहीं मारी जाएगी; आमतौर पर कम प्राथमिकता पर प्रक्रियाओं को चलाने के लिए nohupउपयोग किया जाता niceहै। HUPसंकेत, प्रथा के अनुसार, जिस तरह से एक टर्मिनल लॉगआउट की निर्भर प्रक्रियाओं ने चेतावनी दी है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.