क्या सस्पेंड (नियंत्रण + z) के बिना बैकग्राउंड प्रक्रिया को पृष्ठभूमि में रखना संभव है?


11

मैं एक एप्लिकेशन चला रहा हूं जो टीसीपी और यूडीपी पैकेट प्राप्त करता है और इसलिए इसे निलंबित नहीं किया जा सकता है। मैंने एक ही एप्लीकेशन की 3 प्रक्रियाओं को अलग-अलग तर्कों के साथ, बैकग्राउंड मोड में उपयोग करके तीव्रता से चलाया &। जब मैंने केवल किया $fg, तीनों प्रक्रियाएं अग्रभूमि में आ गईं। अब मैं उन्हें फिर से पृष्ठभूमि में भेजना चाहता हूं लेकिन बिना निलंबन के। मैं उसे कैसे कर सकता हूँ?


यहाँ एक चल रही प्रक्रिया को एक नए स्क्रीन उदाहरण पर ले जाने के बारे में एक सर्वरफ़ॉल्ट विषय है -> serverfault.com/questions/55880/…
एलन बार्बर

जवाबों:


10

पहली चीजें पहली: अग्रभूमि में केवल एक ही प्रक्रिया हो सकती है, तीनों नहीं। fgनवीनतम प्रक्रिया को अग्रभूमि में लाता है। Ctrl+ की प्रक्रिया बनाने के लिए z, फिर bgप्रश्न में आवेदन को "परेशान" न करने के लिए तेजी से टाइपिंग करें (ध्यान दें कि प्रक्रिया अनुसूचक प्रति सेकंड कई बार ऐसा करेगा), अग्रभूमि में प्रक्रिया की पीआईडी ​​का पता लगाएं, फिर दूसरे टर्मिनल में / एसएसएच सत्र, उपयोग

kill -SIGSTOP »pid« ; kill -SIGCONT »pid«

आपका मूल टर्मिनल कहेगा stopped, लेकिन जब से आपने SIGCONTतुरंत भेजा है, प्रक्रिया पृष्ठभूमि में चलती रहेगी।


1
@stefen: आपका समाधान ठोस है। यह किसी भी तरह से मेरी प्रक्रियाओं को चोट नहीं पहुंचाएगा, यह मानते हुए कि अगर हम प्रक्रिया को निलंबित कर देते हैं तो स्थापित सॉकेट कनेक्शन टूट नहीं जाता है (शेड्यूलर स्विचिंग सॉकेट कनेक्शन को डिस्कनेक्ट नहीं करता है यह सुनिश्चित है)। यह डिबग करेगा और अपडेट करेगा। बहुत बहुत धन्यवाद। यदि
rahul.deshmukhpatil

2

यदि आपके पास वास्तव में एक अग्रभूमि काम है, तो बैश इसे पूरा होने की प्रतीक्षा कर रहा है, यह कमोबेश एक अग्रभूमि नौकरी की परिभाषा है । यदि बैश में अभी भी टर्मिनल का नियंत्रण है, तो जांचें कि क्या हो रहा है jobs -l, जैसे:

$ ncat -kl -p 10111 &
[1] 13404
$ ncat -kl -p 10222 &
[2] 13405
$ ncat -kl -p 10333 &
[3] 13406
$ jobs -l
[1]  13404 Running                 ncat -kl -p 10111 &
[2]- 13405 Running                 ncat -kl -p 10222 &
[3]+ 13406 Running                 ncat -kl -p 10333 &

मैंने इसके लिए तीन पृष्ठभूमि ncatसुनने की प्रक्रिया शुरू की । आप नौकरी की स्थिति के लिए "संपन्न" या "रोका" भी देख सकते हैं।

आप प्रभावी रूप से स्टीफन सीडेल के SIGSTOP / SIGCONT विधि का उपयोग करके एक अलग शेल से अग्रभूमि की नौकरी की पृष्ठभूमि तैयार कर सकते हैं (हालांकि एक शेल द्वारा भेजा गया वास्तविक संकेतCtrl - ZSIGTSTP है, या तो सिग्नल को काम करना चाहिए)।

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

शेल के नियंत्रण में चल रही प्रक्रियाओं या पाइपलाइन को "नौकरी" के रूप में संदर्भित किया जाता है, जब आप उस आदेश bgया fgआदेश का उपयोग करते हैं जिसका आप स्पष्ट रूप से सबसे हालिया कार्य का उल्लेख कर रहे हैं - मेरे मामले +में ऊपर वाले के साथ। इन नौकरियों को (अन्य चीजों के बीच) भी स्पष्ट रूप से% 1% 2 या% 3 (संख्या में []) के रूप में संदर्भित किया जा सकता है ।

एक अयोग्य fgआदेश केवल एक नौकरी को प्रभावित करेगा, सबसे हाल ही में, इसलिए आपको वर्तमान स्थिति की अपनी समझ में गलत हो सकता है। एक पृष्ठभूमि नौकरी अभी भी टर्मिनल को लिख सकती है :

  echo foo > /dev/tcp/127.0.0.1/10111

यह निर्भर कर सकता है कि प्रोग्राम टर्मिनल को कैसे संभालता है, ncatलेखन के लिए ठीक काम करता है। पढ़ने के लिए हालांकि कार्यक्रम निष्पादन को रोक देंगे, और आपको "स्टॉप्ड" संदेश दिखाई देगा। शेल प्रक्रियाएं शुरू करेगा और उन्हें SIGTTIN सिग्नल से बाहर निकलने या प्राप्त करने के लिए इंतजार करेगा ( nohupयह एक तरीका है, जैसा कि है disown)।

आप किसी विशिष्ट रुके हुए कार्य को पृष्ठभूमि में रख सकते हैं

$ bg %3

(मेरे मामले में मुझे त्रुटि मिलेगी bash: bg: job 3 already in background)

अन्यथा अगर कोई प्रक्रिया अग्रभूमि में है, जब तक कि कार्यक्रम SIGTSTP को पकड़ नहीं लेता है और कुछ विशेष करता है, तो यह एक त्वरित Ctrl- Zऔर के साथ समस्याओं की संभावना नहीं है bg। इस संबंध में नेटवर्क कार्यक्रमों के बारे में कुछ खास नहीं है, आने वाले कनेक्शन / डेटा को कर्नेल (एक बिंदु तक) द्वारा बफ़र किया जाएगा। एक स्ट्रीमिंग कनेक्शन में एक अवलोकन योग्य ठहराव हो सकता है।

अधिक विवरण के लिए बैश मैन पेज का " JOB CONTROL " अनुभाग देखें।


1

आपके लिए ऐसा करने का सबसे आसान तरीका स्क्रीन प्रोग्राम का उपयोग करना है । आप अपने एप्लिकेशन को वर्चुअल टर्मिनल के भीतर शुरू कर सकते हैं, फिर Ctrl + A, D के साथ स्क्रीन से बाहर निकलें। यदि आप अपना सत्र, अपना प्रकार फिर से शुरू करना चाहते हैं screen -x। यदि आपके पास कई प्रक्रियाएं हैं, तो आपको स्क्रीन के एक सूची के साथ प्रस्तुत किया जाएगा। अधिक जानकारी के लिए कृपया स्क्रीन मैन पेज पढ़ें ।


5
मुझे लगता है कि वह "तथ्य के बाद" एक समाधान ढूंढ रहा है, यानी प्रक्रियाएं अभी चल रही हैं।
स्टीफन सेडेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.