स्क्रीन बनाएं और अटैच किए बिना कमांड चलाएं


29

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

हालांकि, मुझे इससे मुश्किलें हो रही हैं। मैं स्क्रीन को सही ढंग से बना सकता हूं इसके बिना यह अटैचमेंट का उपयोग कर सकता है screen -d -m -S screen_name। हालाँकि, यदि मैं इसके आधार पर एक कमांड चलाता हूं:

screen -S screen_name-X stuff "command 1"'echo -ne '\015''"command 2"'echo -ne '\015''

प्रतिध्वनि के साथ एकल उद्धरणों के बजाए गूंज '\ 015' के साथ लिपटे हुए हैं। यह उपयोगकर्ता को एंटर कुंजी दबाने के लिए अनुकरण करना है क्योंकि मेरे द्वारा उपयोग की जाने वाली कमांड एक निर्देशिका में जा रही है और वहां स्थित स्क्रिप्ट को निष्पादित कर रही है। यह कमांड काम करता है, लेकिन केवल अगर स्क्रीन एक बार इसे बनाने के लिए संलग्न किया गया है। जैसा कि मैं स्क्रीन बनाने और उसके भीतर कमांड चलाने की प्रक्रिया को स्वचालित करने की कोशिश कर रहा हूं, मैं एक स्क्रिप्ट के भीतर संलग्न और अलग होने से बचना चाहूंगा। मैं एक शेल स्क्रिप्ट बनाने के सुझाव की कोशिश करूंगा जिसमें मुझे स्क्रीन के भीतर निष्पादित करने और अपने परिणामों के अनुसार संपादित करने की आवश्यकता होगी।

क्या एक स्क्रीन बनाने और स्क्रीन के भीतर एक कमांड चलाने का एक तरीका है या तो एक कमांड में, या बनाने के बाद स्क्रीन को संलग्न करने के बिना, लेकिन कमांड के निष्पादन से पहले?

अग्रिम में धन्यवाद।

** अद्यतन - मैं एक शेल स्क्रिप्ट के भीतर निष्पादित करने की आवश्यकता के लिए सुझाव देने की कोशिश कर रहा हूं, मैं सफलतापूर्वक स्क्रीन बनाने और स्क्रीन के भीतर से कमांड निष्पादित करने में सक्षम हूं, लेकिन मुझे यह व्यवहार मिल रहा है कि जब स्क्रिप्ट चलना बंद हो जाए स्क्रीन भी बंद हो जाती है। यह समस्या नहीं होनी चाहिए क्योंकि स्क्रिप्ट एक लॉगिंग स्क्रिप्ट है जिसे केवल sys व्यवस्थापक के ज्ञान के साथ बंद करना चाहिए या स्क्रिप्ट के माध्यम से मैं विकसित करने की कोशिश कर रहा हूं, हालांकि स्क्रीन सेटअप को इस तरह से करना बेहतर होगा कि स्क्रीन स्क्रिप्ट बंद कर दिया है, तो गायब नहीं होता है। क्या यह व्यवहार प्राप्त करना संभव है? **


1
मैं इस समस्या में भाग गया और superuser.com पर किसी और के लिए एक समाधान पाया, जो इस समस्या पर ठोकर खाता है superuser.com/questions/342463/…
Dan Herbert

स्क्रीन को खुला रखने के लिए आप कुछ इस तरह का उपयोग कर सकते हैं: स्क्रीन बैश -c 'इको "टेस्ट"; / बिन / बैश '
ग्विन नोव

1
अपने ऑटो-क्लोजिंग मुद्दे के लिए, आप एक विशेष का उपयोग कर सकते हैं .screenrcजिसमें लाइन शामिल है zombie kr, जो एक समाप्त खिड़की को खुला रखेगा, और आप kविंडोड को बंद करने के लिए, या rफिर से विंडो में कमांड चलाने के लिए दबा सकते हैं। मेरे पास मेरे डिफ़ॉल्ट .rcrc के लिए यह है।
मार्टिन सी।

जवाबों:


18

मुझे लगता है कि आप कई मुद्दों में भाग रहे होंगे।

यदि आप पुन: अनुलग्न करने से पहले कमांड समाप्त करते हैं, तो स्क्रीन चली जाएगी। आप इसका उपयोग करके इसका डेमो कर सकते हैं:

screen -d -m ls -l

यह ls -lकमांड चलाएगा , लेकिन screen -listस्क्रीन प्रक्रिया समाप्त होने के बाद इसे नहीं दिखाएगा।

मुझे यह भी पता नहीं है कि आप इस \ 015 सामान के साथ क्या करने की कोशिश कर रहे हैं। शायद आपके प्रश्न को अपडेट करने से मदद मिलेगी, जैसा कि मुझे लगता है कि आप स्क्रीन सत्र में कई कमांड चलाने की कोशिश कर रहे हैं। यह उतना ही सरल होना चाहिए:

screen -d -m bash -c "command1 ; command2 ; command3"

यदि इनका बहुत अधिक उपयोग किया जाता है, तो शायद आपको एक शेल स्क्रिप्ट बनानी चाहिए जो इन कमांडों को चलाती है, फिर अधिक सरल का उपयोग करें:

screen -d -m /path/to/script.sh

वहाँ तुरंत स्क्रीन कोचिंग के बिना समान व्यवहार प्राप्त करने का एक तरीका है? कहो कि मैं एक ssh सत्र शुरू करना चाहता हूं और फिर ठीक बाद में अलग करना चाहता हूं; screen -d -m sshसत्र होने से पहले पासवर्ड प्रॉम्प्ट पर अलग हो जाएगा।
उज्ज्वल-तारा

यह मेरे लिए काम नहीं करता है। लंबे समय से चल रहे कार्यक्रमों के साथ hte "कमांडएन" को बदलने से कुछ भी नहीं दिखाई देता है screen -list। इसके अलावा, यह स्क्रीन का नाम नहीं है क्योंकि ओपी करने की कोशिश कर रहा है।
3

मैं इस पद्धति का उपयोग करके एक अजगर कार्यक्रम चलाना चाह रहा था। मैंने इसे चलाने के लिए एक शा स्क्रिप्ट बनाने की कोशिश की, लेकिन स्क्रीन को सूची में नहीं देखा। इसके बजाय मैंने इस्तेमाल किया screen -d -m python EventGenerator.py, जिसने महान काम किया
डैन सिबोरोव्स्की - एमएसएफटी

1
संभवतः bash -c "commands"इसके बजायbash "commands"
marcovtwout

तुम सही हो, वहाँ -c है
Xdg

9

एक अलग स्क्रीन शुरू करें

screen -dmS <screen name>

पूर्व में बनाई गई अलग स्क्रीन में निष्पादित कमांड

screen -S <screen name> -X stuff '<CMD>\n'

हां, आपको कमांड सबमिट करने के लिए एन्टर सिंबल टाइप करना होगा या फिर यह सिर्फ स्क्रीन पर स्ट्रिंग जोड़ देगा।

http://osdir.com/ml/gnu.screen/2003-09/msg00029.html


1
'सामान' क्या है?
नादव बी

stuffवास्तव में एक कमांड है जो स्क्रीन सत्र में किसी अन्य कमांड को कॉपी-पेस्ट करता है: सामान [स्ट्रिंग] स्ट्रिंग स्ट्रिंग को वर्तमान विंडो के इनपुट बफर में भर दें। यह "पेस्ट" कमांड की तरह है लेकिन बहुत कम ओवरहेड के साथ। पैरामीटर के बिना, स्क्रीन स्ट्रिंग के लिए सामान के लिए संकेत देगा। आप "सामान" कमांड के साथ बड़े बफ़र्स पेस्ट नहीं कर सकते। यह प्रमुख बाइंडिंग के लिए सबसे उपयोगी है। "बिन्दी" भी देखें। [ theterminallife.com/sending-commands-into-a-screen-session/]
एलिसा

2

मैंने पहले भी इस समस्या का सामना किया है, यह एक बग था जिसे साइबरविन कार्यान्वयन के साथ किया गया था।

मैंने जो किया था वह केवल एक ".rcrc_detaching" बनाने के बाद केवल निम्न कमांड था

#detach
detach 

और फिर स्क्रीन के साथ शुरू करें

screen -c ~/loginScripts/tempScreenrc/.screenrc_detaching

फिर आपके पास अपना स्क्रीन सत्र है और इसके पहले से ही संलग्न और अलग किया गया है और आप इसे कमांड को पंप करने के लिए अच्छे हैं।

आसान ! : पी


2

इसने मेरे लिए काम किया, बिना -cकाम किए

screen -d -m bash -c "command1; command2; command3"


1

पिछले उत्तरों का परीक्षण करने के लिए एक copy'n'paste तरीका है:

 # No sessions:
screen -ls

 # Returns immediately:
time screen -dmS screen_descritive_session_name  bash -c 'sleep 20; hostname >> /tmp/h'

 # New session present:
screen -ls

 # File with return of command was created :)
sleep 20; cat /tmp/h

अपेक्षित परिणाम के समान होना चाहिए:

No Sockets found in /var/run/screen/S-yourusernamehere.

(इसका मतलब है कि कोई स्क्रीन-सत्र पहले नहीं बनाया गया था)

real    0m0.002s
user    0m0.000s
sys     0m0.000s

(यह स्क्रीन बनाने और इससे अलग करने के लिए बिताया गया समय है। लगभग तात्कालिक।)

There is a screen on:
    20318.screen_descritive_session_name    (20/08/2018 16:29:35)   (Detached)
1 Socket in /var/run/screen/S-yourusernamehere.

(यह आउटपुट स्क्रीन सत्र उपलब्ध है। अंतिम कमांड पर बनाया गया है।)

sleep 20; cat /tmp/h

(यह catgnu- स्क्रीन के अंदर निष्पादित होस्टनाम दिखाता है)


और ऐसे परीक्षणों का परिणाम क्या है?
पियरे.विरेंस

आप सही हैं, कोई उदाहरण नहीं था। मैं जोड़ दूँगा।
एनरिक

काफी बेहतर! merci! +1
पियरे.वीयर

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