एक उप प्रक्रिया में Ctrl + c पहले स्क्रिप्ट में एक nohup'ed प्रक्रिया को मार रहा है


15

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

यहां न्यूनतम कोड स्क्रिप्ट है (पूर्ण स्क्रिप्ट के लिए संपादन देखें, एक कारण है कि मैं इसे इस तरह से कर रहा हूं);

#/bin/bash
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &

less +F currentOutput.log

यह क्या करने की कोशिश करता है पृष्ठभूमि में एक सर्वर चलाया जाता है, जो लॉग फ़ाइल के लिए आउटपुट करता है।
फिर मैंने followउस लॉग फ़ाइल का उपयोग किया less +F। जैसा कि आप करते हैं, इससे बाहर निकलने के लिए आपको हिट करने से पहले ctrl+ हिट करना होगा ।cQ

क्या होता है, जब मैं ctrl+ कमांड के cअंदर less( tailingइसे रोकने के लिए ) किसी तरह सर्वर nohupको ऊपर से शुरू कर देता है ! और कुछ भी प्रभावित नहीं है। मैं लॉग को फिर से सिलाई शुरू करने के लिए shift+ कर सकता हूं f(जो कि सर्वर के मारे जाने के बाद से कोई नई जानकारी नहीं मिलती है) और अगर मैं हिट Qकरता हूं तो बाकी स्क्रिप्ट सामान्य रूप से निष्पादित होती है।

क्या आप जानते हैं कि ऐसा क्यों होता है? इससे कैसे बचें / मैं कुछ और उपयोग करूं?


PS
सर्वर प्रोग्राम एक के लिए सुन सकता है ^C, जो कि समस्या हो सकती है; क्या मुझे रोकने के लिए कुछ किया जा सकता है? जैसे, जब मैं सिर्फ {SERVERCOMMAND}अपने दम पर चलता हूं (अवरुद्ध तरीके से), मैं हिट कर सकता हूं ctrl+ c, जो तुरंत इसे नहीं मारता है; यह प्रिंट करता है Received ^C signal, shutting down(और फिर खुद को मारता है)। यह तब होता है जब मैं ^Cअंदर होता हूं less(ए फाइनल Received ^C signal, shutting downलॉग को लिखा जाता है)।


पीपीएस
मैं कई चीजों की कोशिश कर रहा हूं (कोई भी काम नहीं किया);

  • बदलकर स्क्रिप्ट से स्टड को डिस्कनेक्ट करने की कोशिश कर रहा है

    nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &
    to
    nohup echo '' | {SERVERCOMMAND} > currentOutput.log 2>&1 &
    or
    nohup cat /dev/null/ | {SERVERCOMMAND} > currentOutput.log 2>&1 &
  • stty intr ^Gरुकावट कमांड को बदलने के लिए उपयोग कर रहा है, लेकिन तब ctrl+ gने ^Cवैसे भी किया था (इसलिए यह मेरे टर्मिनल एमुलेटर के साथ एक मुद्दा हो सकता है konsole) ;

  • कोष्ठक में nohup& / या lessपंक्ति रखकर (इसे उप-स्तरीय बनाने के लिए)

  • xtermइसके बजाय स्क्रिप्ट चल रही हैkonsole


कोई मेरे मुद्दे पर आया हो सकता है ; I think it is due to the handling within the database software, not on the shell। एक कार्यक्रम यह कैसे करेगा? मैं इसे कैसे रोक सकता हूं?
हैशबोर्न

3
nohupSIGHUPसिग्नल प्राप्त करने से प्रक्रिया को रोकता है जबकि CTRL + C SIGINTसिग्नल भेजता है। इसीलिए nohupआपके पास अपेक्षित प्रभाव नहीं है।
पायोत्र डोब्रोगोस्ट

जवाबों:


11

मैं सोच में सही था कि यह किया गया था SIGINTसभी प्रक्रियाओं जब करने के लिए भेजा जा रहा है ctrl+ c, लेकिन मैं सोच में मूर्ख था कि एक और बनाने की प्रक्रिया के बाहर यह लाना होगा process group(में मेरे प्रयास दिखाई P.P.S.)।

यह न केवल सटीक उपयोग का मामला है, बल्कि सही समाधान है।

मेरी स्क्रिप्ट को कैसे संरचित किया गया था, इस कारण उत्तर को शब्दशः फिट नहीं किया गया था, अब यह स्क्रिप्ट है;

#/bin/bash

setsid {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log

I ctrl+ cमें आने के बाद सर्वर लॉग फ़ाइल में आउटपुट जारी रखता है less

सभी के समय के लिए धन्यवाद।


0

क्या आपने डिसाइड किया है ?

  disown -h %1

या जो भी आपका काम है; disown एक शेल निर्मित है, जिसका मैन पेज बताता है:

अस्वीकार

disown [-ar] [-h] [jobspec ...]

विकल्पों के बिना, प्रत्येक कार्यक्षेत्र को सक्रिय नौकरियों की तालिका से हटा दिया जाता है। अगर -h' option is given, the job is not removed from the table, but is marked so that SIGHUP is not sent to the job if the shell receives a SIGHUP. If jobspec is not present, and neither the-a 'न तो -r' option is supplied, the current job is used. If no jobspec is supplied, the-ए' विकल्प का मतलब सभी नौकरियों को निकालना या चिह्नित करना है; जॉबस्पेक तर्क के बिना `-r 'विकल्प ऑपरेशन को नौकरी चलाने के लिए प्रतिबंधित करता है।

संपादित करें

मजेदार बात, आपका निर्माण मेरे आर्क लिनक्स पर काम करता है:

 $ cat testm
  #!/bin/sh

  nohup /home/mario/temp/waste & 

  less +F out.log

 $ cat waste
  #!/bin/sh

  while [ 1 ]; do
    find / -print 2>1 1> out.log
  done
  $ ./testm
   nohup: appending output to nohup.out
  $ ps ax | grep waste
    19090 pts/2    S      0:00 /bin/sh /home/mario/temp/waste
    19124 pts/2    S+     0:00 grep waste]
  $

पीएस कमांड से पहले , मुझे आउट.लॉग फ़ाइल को स्क्रॉल करना था, फिर Ctrl+C, फिर q


हाँ, लेकिन मुझे नहीं पता कि इसे कैसे लागू किया जाए। मैंने nohupएक फ़ंक्शन में लाइन रखने की कोशिश की disowns, जो कि खुद ही थी, लेकिन यह उसी तरह होनी चाहिए nohup। मुझे नहीं लगता कि यह एक SIGHUPमुद्दा है, जब मैं lessलाइन को हटाता हूं , तो स्क्रिप्ट अभी भी चल रहे सर्वर के साथ समाप्त होती है
हैशब्रोएन

@Hashbrown pls मेरा संपादन देखें
MariusMatutiae

हाँ, मैंने एक परीक्षण भी किया, जिसमें एक साधारण बैश स्क्रिप्ट को {SERVER} निष्पादन योग्य के बजाय बुलाया जा रहा था। और नोह ने ठीक काम किया। सवाल पर मेरी टिप्पणी देखें। मुझे लगता है कि यह उद्देश्यपूर्ण रूप से किसी तरह सुन रहा है। चूंकि इसकी एक औचित्य (और अच्छी तरह से ज्ञात नहीं) सर्वर मैं यह भी नहीं कह सकता कि यह कोई ऐसा है जो "ओह इसके एक्स कर रहा है, आपको वाई करने की आवश्यकता है"
हैशब्रोएन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.