एक बार स्क्रिप्ट समाप्त होने के बाद सत्र समाप्त करने से GNU स्क्रीन को रोकें


35

मैं "वर्चुअल" टर्मिनल बनाने के लिए जीएनयू स्क्रीन को मजबूर करने की कोशिश कर रहा हूं, इसे संलग्न किए बिना, स्क्रिप्ट को अंदर निष्पादित करें और स्क्रिप्ट समाप्त होने पर सत्र समाप्त न करें।

मैंने कई संयोजनों की कोशिश की, जिनमें शामिल हैं:

screen -dmS udplistener /share/Sys/autorun/start_udp_listeners.sh

या

screen -S udplistener -X /share/Sys/autorun/start_udp_listeners.sh

और उनमें से किसी ने भी काम नहीं किया। मुझे या तो निष्पादित स्क्रिप्ट के बिना सत्र मिलता है, स्क्रिप्ट निष्पादित होती है, लेकिन यह समाप्त होने के बाद सत्र समाप्त हो जाता है या मुझे "कोई स्क्रीन सत्र नहीं मिला" त्रुटि हो रही है।

मैं मूल रूप से UDP श्रोता को चलाने के लिए कोशिश कर रहा हूं, जिसे PHP में लिखा गया है और इसे इनफिनिट लूप में काम करना है (सुनने में टूटना नहीं)। हां - मैं PHP स्क्रिप्ट &को अंत में चला सकता हूं , PHP CLI को डेमन के रूप में चलाने के लिए मजबूर कर सकता है। समस्या यह है, कि मैं सर्वर (क्यूएनएपी - कबाड़ - कभी भी, कभी भी इस कबाड़ को खरीदता हूं!) नाम के एक टुकड़े का उपयोग कर रहा हूं, जो इसे अनदेखा करता प्रतीत होता है। जैसे ही मैं SSH सत्र लॉगऑफ़ करता हूं, स्क्रिप्ट बंद हो जाती हैं।

तो screenयह एकमात्र विकल्प प्रतीत होता है। लेकिन मुझे समझ नहीं आ रहा है, एक बार कमांड या स्क्रिप्ट समाप्त होने के बाद सत्र क्यों समाप्त हो जाता है?

संपादित करें : मैंने इंटरनेट में पाया उदाहरण भी आज़माया है:

screen -dmS name
screen -S name -p windowname -X stuff 'mc
'

कोई कमी नहीं! इसे संलग्न करने के बाद ( screen -R name) मैं देखता हूं कि मिडनाइट कमांडर एचएसएनटी को निष्पादित नहीं किया गया है। हालांकि उदाहरण लेखक ने कहा, यह होगा।


जिस तरह से आप आह्वान कर रहे हैं screen, आप केवल एक कमांड चलाने के लिए एक विंडो बनाते हैं। जब कमांड बाहर निकलती है, तो विंडो बंद हो जाती है और screenउसके पास करने के लिए कुछ नहीं बचता है, इसलिए यह बाहर निकल जाता है।
jw013

तो ... क्या दो विंडो खोलने का एक तरीका है (केवल कमांड लाइन का उपयोग करना, कोई कीबोर्ड संयोजन नहीं), एक स्क्रिप्ट निष्पादित करने के लिए और दूसरा screenबंद करने से रोकने के लिए ? BTW: मैं अभी भी पीछे विचार नहीं मिलता है! अगर मैं फोन करता हूं screen -dmS name, तो मैं एक अलग खिड़की बनाता हूं, जिसमें कुछ करने के लिए भी नहीं होता है। लेकिन यह स्वचालित रूप से बंद नहीं है! लेकिन जब मैं उस अलग स्क्रीन में कुछ निष्पादित करना चाहता हूं, तो एक बार निष्पादन समाप्त हो जाता है। क्यूं कर? मैं यहाँ तर्क नहीं देखता। खिड़की कुछ भी नहीं कर सकती है, लेकिन खिड़की कुछ नहीं कर सकती है और फिर कुछ भी नहीं कर रही है?
trejder

2
जब आप एक आदेश निर्दिष्ट किए बिना एक खिड़की शुरू करते हैं, यह है नहीं "कुछ नहीं कर रहे।" "कुछ" जो वह कर रहा है वह एक इंटरैक्टिव शेल चला रहा है, जो तब तक बाहर नहीं निकलता जब तक आप इसे मैन्युअल रूप से बाहर नहीं निकलते।
jw013

ठंडा! स्पष्टीकरण के लिए धन्यवाद! तो ... वापस प्रश्न पर ... क्या किसी तरह से अलग स्क्रीन / विंडो के अंदर कमांड चलाने का कोई तरीका है और उस सत्र को समाप्त करने का समय नहीं है, एक बार एग्जीक्यूटिव समाप्त हो जाता है? इसके अलावा, कृपया अद्यतन प्रश्न पर एक नज़र डालें। धन्यवाद।
trejder

यह स्क्रिप्ट PHP में लिखे गए दो UDP श्रोताओं को निष्पादित कर रही है। हालाँकि, दोनों को डेमॉन के रूप में ( &अंत में), छोटी गाड़ी (QNAP) के कारण निष्पादित किया जाता है , लेकिन सत्र समाप्त होने पर उन्हें समाप्त कर दिया जाता है (मुझे बताया गया था, यदि वे सामान्य लिनक्स पर नहीं हैं, तो निष्पादित किया जाता है &)। इसलिए मैं start_udp_listeners.shखत्म होने के बाद कुछ भी नहीं करना चाहता हूं , केवल सत्र को समाप्त होने से कैसे रोकें। जब तक यह नहीं है, मेरे PHP श्रोताओं बस ठीक काम कर रहे हैं।
trejder

जवाबों:


42

पटकथा पूरी होने के बाद स्क्रीन को व्यस्त रखने के लिए, बस एक खिड़की में कुछ लगातार चलाते रहें। उस "कुछ" के लिए सबसे सरल विकल्प संभवतः एक इंटरैक्टिव शेल है। इसे करने का एक तरीका यहां है ( bashइंटरेक्टिव शेल की पसंद के रूप में)

screen -dmS session_name sh -c '/share/Sys/autorun/start_udp_listeners.sh; exec bash'
  • -dm: स्क्रीन को अलग मोड में शुरू करता है
  • -S: बाद में आसान पुनर्प्राप्ति के लिए स्क्रीन के लिए सत्र का नाम सेट करता है
  • sh -c '...': बस अपनी स्क्रिप्ट चलाने के बजाय, जो समाप्त हो जाएगी, sh -cकई कमांड चलाने के लिए उपयोग करें
  • exec bash: स्क्रिप्ट समाप्त होने के बाद, shऊपर से एक इंटरैक्टिव शेल ( bash) पर स्विच हो जाएगा , जिसे कभी भी बाहर नहीं निकलना चाहिए जब तक कि कोई बाहरी इसे समाप्त न कर दे। यह screenतब तक खुला रहेगा जब तक bashउदाहरण जीवित है।

1
हम्म ... लगता है तुम मेरे जीवन रक्षक हो! :] export IGNOREEOF=1Ctrl + D के साथ आकस्मिक समाप्ति को रोकने के लिए अपने समाधान का विस्तार मुझे सही समाधान देना चाहिए, मैं पूरी शाम देख रहा हूं। धन्यवाद! :]
trejder

यह आज के रूप में डेबियन पर काम नहीं करता है, -c एक विकल्प है। एक विकल्प को पढ़ने के लिए एक स्क्रीन पर क्लिक करें ...
ToVine

@ToVine डेबियन अस्तबल (व्हीजी) पर पूरी तरह से काम करता है। मैं bash -cहालांकि इस्तेमाल किया ।
TranslucentCloud

@TranslucentCloud ने पूरे उद्धरण में "bash -c ..." को संलग्न किया था? पिछली बार मैंने इसे आज़माया था (टिप्पणी लिखने से ठीक पहले) यह मेरे लिए काम नहीं करता था, मुझे यकीन नहीं था कि क्यों ...
ToVine

: @ToVine यहाँ मेरा पूरा आदेश हैscreen -LS sauf bash -c "sudo aptitude update && sudo aptitude full-upgrade; exec bash"
TranslucentCloud

2

मुझे sh -cअपने रास्पबेरी पी 2 पर डेबियन 7.8 चलाने के साथ कोई भाग्य नहीं था । लेकिन bash -cकाम किया:

कमान:

/usr/bin/screen -dmS test-screen bash -c "/usr/bin/top; exec bash"

क्या यह हो सकता है, क्योंकि आप (रास्पबेरी पाई पर) एक अलग शेल का उपयोग कर रहे हैं? bashऔर shदो अलग अलग गोले हो रहा है। यह सब, मुझे लगता है, लेकिन मैं गलत हो सकता हूं, क्योंकि मैं लिनक्स पर नौसिखिया हूं।
trejder

1
श डिफॉल्ट यूनिक्स-शेल है, यह रास्पियन (डेबियन) में शामिल है। कमांड श भी काम करता है, लेकिन स्क्रीन के साथ संयोजन में sh -c नहीं।
scotty86

धन्यवाद @ scotty86, मैंने लिनक्स मिंट 19 (उबंटू 18.04) में वही देखा और चाल बदल sh -cदी bash -c। मुझे समझ में नहीं आता है, दोनों क्यों shऔर bashस्थापित हैं, इसलिए मैं अभी भी इस पर नींद खो रहा हूं, लेकिन कम से कम यह काम करता है।
रेड्संड्रो

shशायद /bin/dashइसके बजाय इंगित करता है /bin/bash। डेबियन से डिफ़ॉल्ट खोल बंद bashकरने के लिए dashकुछ साल पहले।
स्काइ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.