जब मैं नोहप के बावजूद टर्मिनल बंद करता हूं तो क्रोमियम-ब्राउज़र क्यों मारा जाता है?


12

यह प्रश्न पुराना है, और मैं अभी भी स्पष्ट नहीं हूं कि क्यों।


2014 में मूल प्रश्न:

एक गनोम टर्मिनल टैब में, मैं भाग गया

$ nohup chromium-browser &

लेकिन जब मैं टर्मिनल टैब बंद करता हूं, तो chromium-browserभी बाहर निकल जाता है। nohupइसे रोकने के लिए नहीं माना जाता है? गिल्स ने कहा:

nohup और disown दोनों को SIGHUP को दबाने के लिए कहा जा सकता है, लेकिन अलग-अलग तरीकों से। nohup प्रोग्राम को शुरू में संकेत को अनदेखा करता है (प्रोग्राम इसे बदल सकता है)। nohup प्रोग्राम को एक नियंत्रित टर्मिनल नहीं होने की व्यवस्था करने की भी कोशिश करता है, ताकि टर्मिनल बंद होने पर इसे कर्नेल द्वारा SIGHUP नहीं भेजा जाएगा। विस्थापित शुद्ध रूप से खोल के लिए आंतरिक है; जब यह समाप्त हो जाता है तो यह शेल को SUPUP नहीं भेजने का कारण बनता है।

तो क्या nohup क्रोमियम-ब्राउज़र SIGHUP को अनदेखा नहीं करता है?

मैं इसे अन्य निष्पादकों पर भी देख रहा हूं, जैसे कि और एमएसीएस (जीयूआई मोड)। लेकिन xeyes पर नहीं।

यह उबंटू 12.04, 32-बिट पर हो रहा है जब प्रश्न पोस्ट किया गया था।


2015 में अपडेट,

अब मैं Ubuntu 14.04 चला रहा हूं, स्थापित होने के google-chromeबजाय chromium-browser। क्रोमियम-ब्राउज़र के साथ भी वही हुआ जो अब गूगल-क्रोम के साथ होता है। nohup google-chrome 2>/dev/null &टर्मिनल टैब बंद होने पर इसे बंद होने से नहीं बचाता है। /usr/bin/google-chromeएक बैश स्क्रिप्ट की एक कड़ी है /opt/google/chrome/google-chromenohupबैश स्क्रिप्ट पर काम क्यों नहीं होता है? हम इसे बैश स्क्रिप्ट पर कैसे काम कर सकते हैं? पायथन लिपियों के बारे में क्या?


1
आपको अपने पर्यावरण के बारे में अधिक बताना चाहिए। मैं आपके परीक्षण के मामले को पुन: पेश नहीं करता।
जूलियाग्रे

आप इसे किस अन्य निष्पादन के साथ देख रहे हैं? उदाहरण के लिए, कुछ सरल करने का प्रयास करें xeyes
वॉरेन यंग

@WarrenYoung: Emacs (GUI)। लेकिन xeyes काम करता है।
टिम

जवाबों:


12

जब आप एक गनोम टर्मिनल विंडो को बंद करते हैं, तो एक SITEUP को शेल में भेजा जाता है जो यह चल रहा था। शेल आमतौर पर हर प्रक्रिया समूह को एक SITEUP भेजेगा जिसे वह जानता है कि इसे बनाया गया है - यहां तक ​​कि लोगों के साथ शुरू हुआ nohup- और फिर बाहर निकलें। यदि शेल है bash, तो वह किसी भी प्रक्रिया समूह के लिए एक SITEUP भेजना छोड़ देगा जिसे उपयोगकर्ता ने चिह्नित किया है disown

nohupइसके साथ एक कमांड चलाना इसे SIGHUP की अनदेखी करता है, लेकिन यह प्रक्रिया बदल सकती है। जब किसी प्रक्रिया के लिए SIGHUP का डिफॉल्ट डिफ़ॉल्ट होता है, तो यदि वह SIGHUP प्राप्त करता है, तो प्रक्रिया समाप्त हो जाएगी।

लिनक्स एक चल रही प्रक्रिया की सिग्नल सेटिंग्स की जांच करने के लिए कुछ उपकरण प्रदान करता है।

क्रोमियम-ब्राउज़र शेल स्क्रिप्ट एक execसंकलित ऐप का काम करता है , इसलिए इसकी प्रक्रिया आईडी समान रहती है। इसलिए इसकी सिग्नल सेटिंग देखने के लिए, मैं भागा nohup chromium-browser &और फिर /proc/$!/statusसिग्नल डिस्पोजल देखने के लिए देखा ।

SigBlk: 0000000000000000
SigIgn: 0000000000001000
SigCgt: 0000000180014003

वे हेक्स संख्या हैं। इससे पता चलता है कि SITEUP पकड़ा नहीं गया है और इसे नजरअंदाज नहीं किया गया है। केवल SIGPIPE (SigIgn में 13 वां बिट) को नजरअंदाज किया जाता है। मैंने इसे निम्नलिखित कोड में ट्रेस किया :

// Setup signal-handling state: resanitize most signals, ignore SIGPIPE.
void SetupSignalHandlers() {
  // Sanitise our signal handling state. Signals that were ignored by our
  // parent will also be ignored by us. We also inherit our parent's sigmask.
  sigset_t empty_signal_set;
  CHECK(0 == sigemptyset(&empty_signal_set));
  CHECK(0 == sigprocmask(SIG_SETMASK, &empty_signal_set, NULL));

  struct sigaction sigact;
  memset(&sigact, 0, sizeof(sigact));
  sigact.sa_handler = SIG_DFL;
  static const int signals_to_reset[] =
      {SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT, SIGFPE, SIGSEGV,
       SIGALRM, SIGTERM, SIGCHLD, SIGBUS, SIGTRAP};  // SIGPIPE is set below.
  for (unsigned i = 0; i < arraysize(signals_to_reset); i++) {
    CHECK(0 == sigaction(signals_to_reset[i], &sigact, NULL));
  }

  // Always ignore SIGPIPE.  We check the return value of write().
  CHECK(signal(SIGPIPE, SIG_IGN) != SIG_ERR);
}

टिप्पणी के बावजूद, माता-पिता द्वारा नजरअंदाज किए गए संकेतों की अनदेखी नहीं की जा रही है। क्रोमेट्स को मार देगा एक SITEUP।

वर्कअराउंड यह करना है कि @ xx4h क्या इंगित करता है: disownअपने bash में कमांड का उपयोग करें , ताकि यदि bash को बाहर निकलना पड़े, तो यह chromium-browserप्रक्रिया समूह को SIGHUP नहीं भेजता है । आप ऐसा करने के लिए एक फ़ंक्शन लिख सकते हैं:

mychromium () { /usr/bin/chromium-browser & disown $!; }

धन्यवाद। अब मुझे समझ में आया कि आपका क्या मतलब था। "चूंकि स्क्रिप्ट कभी इस जाल को रीसेट नहीं करती है, इसलिए वास्तविक क्रोमियम बाइनरी को डिफ़ॉल्ट पर सेटअप के स्वभाव के साथ बुलाया जाता है।" "इस जाल को रीसेट करें" से, क्या आपका मतलब है कि डिफ़ॉल्ट के लिए SITEUP के लिए जाल को बदलना, जो प्रक्रिया को समाप्त करता है? आप "इस जाल को कैसे रीसेट करें"?
टिम

ओह, "इस जाल को रीसेट करें" से मेरा मतलब था कि "इस सिग्नल के फैलाव को वापस उसी तरह सेट करें जिस तरह से शेल स्क्रिप्ट को इसके लिए हैंडलर सेट करने से पहले था"। यदि शेल ने किया trap "" 1, तो वह शेल (और उसके बच्चों) को SITEUP की उपेक्षा करेगा। मैं इसे स्पष्ट करूंगा।
मार्क प्लॉटनिक

धन्यवाद। आपके स्पष्टीकरण के बाद इसकी जांच करेंगे। मैं अब डेमॉन, नोहूप, डिसऑन और बैकग्राउंड को समझने की कोशिश कर रहा हूं, इसलिए मैं अपने पुराने सवालों और उत्तरों को फिर से समझने के लिए वापस आया हूं जो मुझे समझ नहीं आए। Nohup, Disown और बैकग्राउंड के बारे में भ्रम ज्यादातर हल हो गए हैं, और मैं डेमन की अवधारणा और एक प्रक्रिया को डेमोनाइज़ करने के तरीके (नीचे देखें) के साथ फंस गया हूं। यदि आपके पास फिर से मदद करने का समय है तो मैं फिर से सराहना करता हूं।
टिम


मैंने क्रोमियम ऐप कोड को देखा, और यह एप्लिकेशन ++ में सी + कोड को रीसेट करता है और बिना शर्त डिफ़ॉल्ट रूप से सेटअप करता है। trapखोल स्क्रिप्ट में कमांड आवरण इसे रोकने नहीं है, और चल रहा है nohupइसे रोकने नहीं कर सकते। मैं इसे दर्शाने के लिए अपने उत्तर को संशोधित करूंगा।
मार्क प्लॉटनिक

2

अगर chromium-browserऐसा कुछ है google-chromeतो मुझे लगता है कि सबसे अधिक संभावना मुद्दा यह है कि है chromium-browser नहीं हैchromium , लेकिन इसके बजाय एक खोल-आवरण जो तब राज्य initializes है execएस chromium

मेरी google-chromeस्थापना में द्विआधारी वास्तव में स्थित है /opt/google/chromeऔर रैपर /usr/binकेवल एक शेल स्क्रिप्ट है जो बहुत सारे पर्यावरण को xdg-*चूक और पूर्ण पथ से संबंधित करता है और बाइनरी के साथ खुद को बदलने से पहले समान है।

इस बिंदु पर किसी भी संकेत nohupको शुरू में नजरअंदाज किया जा सकता है, जिसे लिपि की ओर से यह कहा जाता है कि उसका बच्चा बात करना बंद कर देगा और जब तक रैपर लिपि सावधान नहीं होती है, अन्यथा वह (जो ऐसा नहीं है) शेट्टी को विरासत में मिली है।

file /usr/bin/chromium-browserयह जाँचने की कोशिश करें कि क्या यह शेल-स्क्रिप्ट है जो मुझे लगता है कि यह है। यदि हां, तो इसे बेहतर तरीके से लिखने पर विचार करें।

मैं कह सकता हूं कि ऐसा करने google-chrome 2>/dev/null &से यह मेरे लिए खुला रहता है, लेकिन मैं याद नहीं कर सकता कि अगर मैं स्क्रिप्ट में किए गए संशोधनों का एक संभावित परिणाम है - यह एक साल पहले खत्म हो गया था।


धन्यवाद। chromium-browserपहले जो हुआ था वही google-chromeअब भी होता है । मैंने chromium-browserस्थापित नहीं किया है। nohup google-chrome 2>/dev/null &टर्मिनल टैब बंद होने पर इसे बंद होने से नहीं बचाता है। google-chromeएक बैश स्क्रिप्ट है /opt/google/chrome/google-chrome। नशप ने बैश स्क्रिप्ट पर काम क्यों नहीं किया? हम इसे बैश स्क्रिप्ट पर कैसे काम कर सकते हैं? पायथन लिपियों के बारे में क्या?
टिम

खैर, यह स्क्रिप्ट पर काम करता है , लेकिन वास्तविक chromeबाइनरी द्वारा प्रतिस्थापित किए जाने से पहले स्क्रिप्ट केवल कुछ नैनो-सेकंड के लिए चलती है ।
mikeserv

क्या आप स्क्रिप्ट में कह रहे हैं कि execवास्तविक chromeबाइनरी है? फिर मैं स्क्रिप्ट को कैसे संशोधित करूं? यहाँ मेरा है/opt/google/chrome/google-chrome
टिम

@ टिम - हाँ - नीचे देखें? exec -a "$0" "$HERE/chrome" ... || exec -a "$0" "$HERE/chrome"... शीर्ष पर $HEREमान के लिए सेट किया गया है readlink $0 (जो आपके स्थापना पथ के लिए है google-chrome) लेकिन /opt/google/chrome/chromeद्विआधारी है - जो कि स्क्रिप्ट के साथ ही प्रतिस्थापित करता है।
mikeserv

@Tim: जहाँ तक कैसे चला जाता है - तुम सिर्फ ड्रॉप कर सकते हैं execशायद। आप w / एक अतिरिक्त पिड (इसके 1000 अन्य से परे) और वेटिंग शेल प्रक्रिया को हवा देंगे , लेकिन मुझे लगता है कि इसकी सीमा है। या फिर आप execw / nohupहो सकता है की जगह ले । यह सब ज्यादातर उस पर निर्भर करता है जो chromeबर्दाश्त करेगा - लेकिन इसे उसी तरह काम करना चाहिए।
mikeserv

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