यदि मैं एक पृष्ठभूमि प्रक्रिया शुरू करता हूं और फिर लॉग आउट करता हूं, तो क्या यह चलता रहेगा?


29

एक सहकर्मी के साथ लंबे समय तक चर्चा के बाद यह पूछना, मैं वास्तव में यहाँ स्पष्टीकरण चाहूंगा।

मैं एक पृष्ठभूमि प्रक्रिया शुरू करता हूं, या तो &कमांड लाइन पर " " जोड़कर या इसे रोककर CTRL-Zऔर इसे " bg" के साथ पृष्ठभूमि में फिर से शुरू करके । फिर मैं लॉग आउट हो गया।

क्या होता है?

हमें पूरा यकीन था कि इसे SIGHUP द्वारा मार दिया जाना चाहिए था, लेकिन ऐसा नहीं हुआ; फिर से लॉग इन करने पर, प्रक्रिया खुशी से चल रही थी और pstreeदिखाया गया कि यह "द्वारा अपनाया गया" है init

क्या यह अपेक्षित व्यवहार है?

लेकिन फिर, अगर यह है, तो nohupकमांड का उद्देश्य क्या है? ऐसा लगता है कि इस प्रक्रिया को वैसे भी नहीं मारा जा रहा है, इसके साथ या इसके बिना ...


संपादित करें 1

कुछ और विवरण:

  • कमांड को SSH सत्र से लॉन्च किया गया था, न कि भौतिक कंसोल से।
  • कमांड को बिना nohup और / या लॉन्च किया गया था &; इसे तब निलंबित कर दिया गया था CTRL-Zऔर इसके साथ पृष्ठभूमि में फिर से शुरू किया गया था bg
  • Ssh सत्र ड्रॉप नहीं हुआ । एक वास्तविक लॉगआउट था (" exit" कमांड)।
  • प्रक्रिया एक scpफाइल कॉपी ऑपरेशन थी।
  • फिर से लॉग इन करने पर, pstreeप्रक्रिया चल रही है और बच्चे के होने का पता चलता है init

संपादित करें 2

प्रश्न को और अधिक स्पष्ट रूप से बताने के लिए: एक प्रक्रिया को पृष्ठभूमि में रखना (उपयोग करना &या करना bg) इसे अनदेखा कर देगा SIGHUP, ठीक वैसे ही जैसे nohupकमांड करता है?


संपादित करें 3

मैं स्वयं एक भेजने की कोशिश की SIGHUPकरने के लिए scp: यह बाहर निकल गया, तो यह निश्चित रूप से संकेत की अनदेखी नहीं करता है।

फिर मैंने इसे फिर से लॉन्च करने की कोशिश की, इसे पृष्ठभूमि में रखा और लॉग ऑफ कर रहा था: इसे "अपनाया" द्वारा initरखा गया और चालू रखा, और मैंने इसे वापस लॉग ऑन करते समय पाया।

मैं अब काफी हैरान हूं। ऐसा लगता है कि SIGHUPसभी अप-लॉगिंग बंद पर कोई भेजा नहीं गया था।


मुझे वहाँ कंसोल I / O का कोई उल्लेख नहीं दिखाई दिया, जो चीजों को ट्रिप भी करेगा। क्या आपने चीजों को डायवर्ट किया है यानी 1>/dev/null 2>&1बैश वगैरह के लिए?
एवरी पायन

नहीं, मैंने नहीं किया। एससीपी बेशक मानक इनपुट की आवश्यकता नहीं थी ... और मानक उत्पादन एक मुद्दा नहीं लगता था।
मैसिमो

आपके शेल को लॉगिन शेल परिवर्तन प्रदर्शन के रूप में निष्पादित किया जाता है या नहीं, जो यहां हो सकता है।
वॉर्नर

कुछ अन्य परीक्षण किए; मैंने इसे यहाँ प्रस्तुत किया है: serverfault.com/questions/117152
मासिमो

जवाबों:


20

उत्तर मिला।

BASH के लिए, यह huponexitशेल विकल्प पर निर्भर करता है , जिसे अंतर्निहित shoptकमांड का उपयोग करके देखा और / या सेट किया जा सकता है ।

ऐसा लगता है कि यह विकल्प डिफ़ॉल्ट रूप से बंद है, कम से कम RedHat- आधारित सिस्टम पर।

BASH मैन पेज पर अधिक जानकारी :

किसी SIGHUP के प्राप्त होने पर शेल डिफ़ॉल्ट रूप से बाहर निकलता है। बाहर निकलने से पहले, एक इंटरेक्टिव शेल सभी जॉब के लिए, रनिंग या रोके जाने के लिए SITEUP का समाधान करता है। बंद नौकरियों को SIGCONT भेजा जाता है ताकि यह सुनिश्चित हो सके कि वे SIGHUP प्राप्त करते हैं। शेल को किसी विशेष कार्य के लिए सिग्नल भेजने से रोकने के लिए, इसे जॉब टेबल से हटाए गए बिलिन के साथ हटा दिया जाना चाहिए (नीचे दिए गए SHIL BUILTIN COMMANDS देखें) या disown -h का उपयोग करके SIGHUP प्राप्त नहीं करने के लिए चिह्नित किया गया है।

यदि हूपोनेक्सिट शेल विकल्प को शॉपट के साथ सेट किया गया है, तो बैश एक इंटरेक्टिव लॉग इन एक्स्टिट होने पर सभी जॉब के लिए एक साइट भेजता है।


2
यह एक मूर्खतापूर्ण डिफ़ॉल्ट है, लेकिन मेरी हिम्मत मुझे बताती है कि यह बैश के बजाय आरएच दोष है। Btw, zsh के साथ आप का उपयोग कर सकते हैं! के रूप में विघटित करने के लिए एक शॉर्टकट के रूप में, और प्रक्रियाओं के साथ forked और sighup मिलता है।
जुरगेन स्ट्रोबेल

7

मैं वार्नर से सहमत हूं और केवल यह जोड़ना चाहता हूं कि आप शेल्टअप को बिलिन "डिस्काउन्ड" कमांड के साथ भेज सकते हैं। बैश मैन पेज में एक अच्छा वर्णन है।


4

आप कमांड nohup का उपयोग कमांड लॉन्च करने के लिए कर सकते हैं और आउटपुट को nohup आउटपुट फ़ाइल में रीडायरेक्ट कर सकते हैं । Nohup मैन पेज से:

nohup - run a command immune to hangups, with output to a non-tty

अन्य विकल्प स्क्रीन कमांड का उपयोग करना है । स्क्रीन का उपयोग करने का लाभ यह है कि आप बाद में प्रक्रिया को फिर से कनेक्ट कर सकते हैं।


क्यों घटता है? लॉगआउट पर एक प्रक्रिया को मारने से बचने के लिए नोह और स्क्रीन का उपयोग पूरी तरह से स्वीकार्य तरीके हैं। अन्य हैं, लेकिन ये दोनों काम करते हैं। क्या बात है?
जिम

2
मुझे लगता है कि यह एक महान बिंदु है, लेकिन क्यू इस बारे में है कि उसकी प्रक्रियाओं को क्यों नहीं मारा जा रहा है "उन्हें कैसे मारा जाए?"
कारपेंक्टम

2

जब आप बैकग्राउंड में एक प्रक्रिया को फोर्क करते हैं, तो यह अभी भी शेल निष्पादित करने वाले बच्चे की प्रक्रिया होगी।

एक शेल के तहत चलने वाली सभी बाल प्रक्रियाओं को बाहर निकलने पर एक साइटअप भेजा जाता है। प्रदर्शन सटीक स्थिति के आधार पर थोड़ा भिन्न होता है, जो कि बैश के मैनपेज में विस्तृत होता है। अन्य गोले के समान विवरण हैं।

अपाचे, और अन्य डेमॉन, आमतौर पर S नाईटअप पर कॉन्फ़िगरेशन को पुनः लोड करते हैं। यूजरस्पेस यूटिलिटीज अक्सर मर जाते हैं। संकेतों से जुड़ा अनुप्रयोग प्रदर्शन आवेदन के लिए अद्वितीय हो सकता है।


तो इस प्रक्रिया को अभी इस मामले में एक अधिकार प्राप्त करना चाहिए था, है ना? शायद यह सिर्फ इसे नजरअंदाज कर दिया, मैं जाँच करूँगा।
मैसिमो

हाँ बिल्कुल। मेरा मानना ​​है कि स्थिति यह है। यदि आपको वास्तव में प्रलेखित प्रदर्शन पर संदेह है, तो आप सिग्नल को फंसाने और उसे लॉग करने के लिए थोड़ी स्क्रिप्ट को हैक कर सकते हैं।
वॉर्नर

0

प्रक्रिया क्या थी? पहले की पोस्टिंग 1 में वर्णित प्रदर्शन सटीक था।

कुछ स्क्रिप्ट फ़ंक्शंस और प्रोसेस सिग्नल को ट्रैप कर सकते हैं। जबकि लूप्स पागलों की तरह भाग सकते हैं।

देख:

SSH सत्र बूँदें - क्या कमांड निष्पादित करना जारी रखता है?

1 को 4:22 बजे संपादित करें

बैश मैनपेज से:

The shell exits by default upon receipt of a SIGHUP.   Before  exiting,
an  interactive  shell  resends  the  SIGHUP  to  all  jobs, running or
topped.

प्रारंभिक अनुसंधान 1 दिखा रहा है कि ओपनएसएसएच शायद SightUP, शायद अधिक संकेतों की अनदेखी करता है।


सवाल पूछने के लिए उस पोस्ट ने वास्तव में मुझे चौंका दिया। विवरण के लिए, ऊपर संपादन देखें।
मैसिमो

2
दूसरे सूत्र में दिए गए जवाबों से ऐसा लगता है कि आपको एससीपी कमांड पर पढ़ने की जरूरत है जो आप उपयोग कर रहे हैं और देखें कि यह
SITUP पर

और 'nohup' उन कमांड्स के लिए है जिन्हें आप जानते हैं कि वे एक SITEUP के साथ मर जाएंगे और आप उन्हें नहीं चाहते, मुझे लगता है।
एमफिनी

मैन पेज सिर्फ यह नहीं बताता है; मैं इसे मारने की कोशिश करूँगा -HUP कल ...
मैसिमो

-1

यदि आपने कमांड को टूल के माध्यम से लॉन्च नहीं किया है screen, तो जब सत्र समाप्त होता है, तो उस सत्र से जुड़े सभी कार्य / कार्य करें।


ठीक यही मैं सोच रहा था, सिवाय ... वे बस नहीं थे।
मैसिमो

उन्होंने हर बार मेरे द्वारा किए गए कार्यों का वर्णन किया है ... शायद यह आपके द्वारा उपयोग किए जाने वाले शेल पर निर्भर करता है?
वॉरेन

-1 वे नहीं; जवाब इतना आसान नहीं है। मैंने केवल एक साधारण शेल स्क्रिप्ट का परीक्षण किया, जिसे मैंने पृष्ठभूमि में शुरू किया था; यह लूप हो गया और एक टेम्प फाइल में आउटपुट भेजा गया। मैंने टर्मिनल से बाहर निकलने के बाद इसे चालू रखा (जैसा tail -fकि अस्थायी फ़ाइल द्वारा देखा गया था। यह बैश का उपयोग करते हुए एक सेंटोस 7.1 मशीन पर है।
माइक एस

@ मायके - कृपया प्रदर्शित करें। मैंने कभी भी आपके द्वारा वर्णित व्यवहार को नहीं देखा है
वॉरेन

@warren - serverfault.com/questions/117152/… पर मेरा उत्तर देखें । ध्यान दें कि कई लोग आपके द्वारा वर्णित वर्णन से भिन्न व्यवहार का दावा करते हैं; वास्तव में, मास्सिमो ने ठीक ही पोस्ट किया क्योंकि उसकी प्रक्रिया जारी रही।
माइक एस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.