एक अलग स्क्रीन पर पाठ इनपुट भेजना


44

मैं अपने अप्रकाशित सर्वर पर एक मिनीक्राफ्ट सर्वर चलाने की कोशिश कर रहा हूं।

सर्वर शेल में चलेगा, और फिर इनपुट के इंतजार में वहां बैठेगा। इसे रोकने के लिए, मुझे 'स्टॉप' टाइप करना होगा और एंटर दबाना होगा, और फिर यह दुनिया को बचाएगी और इनायत से बाहर निकलेगी, और मैं वापस शेल में हूँ। यह सब काम करता है अगर मैं इसे NAS बॉक्स में टेलनेटिंग के माध्यम से चलाता हूं, लेकिन मैं इसे सीधे बॉक्स पर चलाना चाहता हूं।

यह वही है जो मैंने पहले प्रयास के रूप में किया था:

#define USER_SCRIPT_LABEL Start Minecraft server
#define USER_SCRIPT_DESCR Start minecraft server. needs sde2 mounted first
cd /mnt/disk/sde2/MCunraid
screen -d -m -S minecraft /usr/lib/java/bin/java -Xincgc -Xmx1024M -jar CraftBukkit.jar

MCunraid वह फ़ोल्डर है जहां मेरे पास Craftbukkit.jar और सभी दुनिया फाइलें आदि हैं। अगर मैं उस स्क्रीन लाइन को सीधे टाइप करता हूं, तो स्क्रीन सेटअप अलग हो जाती है और सर्वर लॉन्च होता है। अगर मैं स्क्रिप्ट के भीतर से उस लाइन को निष्पादित करता हूं तो स्क्रीन सेट करना संभव नहीं लगता

सर्वर को रोकने के लिए, मुझे STOP में 'टाइप' करना होगा और फिर एंटर दबाना होगा। मेरा दृष्टिकोण था

screen -S minecraft -X stuff "stop $(echo -ne '\r')"

पाठ स्टॉप और गाड़ी वापसी के लिए 'मिनीक्राफ्ट' स्क्रीन पर भेजने के लिए। लेकिन यह काम नहीं करता है, भले ही मैं इसे सीधे कमांड लाइन पर टाइप करता हूं। लेकिन अगर मैं 'स्क्रीन -r' करता हूं, तो मैं चल रहे सर्वर से स्क्रीन पर पहुंच सकता हूं, फिर 'स्टॉप' टाइप करें और यह ठीक से बंद हो जाए।

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


यह सही लग रहा है । स्क्रिप्ट की पूरी सामग्री क्या है और आप इसे कैसे चला रहे हैं? क्या यह कोई आउटपुट देता है? आप कैसे बताते हैं कि screenशुरू करने में विफल रहा? set -xस्क्रिप्ट के शीर्ष पर जोड़ने की कोशिश करें ( #!लाइन के ठीक बाद ) और स्क्रिप्ट चलाते समय ट्रेस आउटपुट की रिपोर्ट करें।
गिल्स एसओ- बुराई को रोकें '28

यह स्क्रिप्ट की पूरी सामग्री है :) स्क्रीन कमांड काम करता है अगर मैं इसे सीधे टाइप करता हूं, तो मुझे लगता है कि मेरा मुख्य मुद्दा स्टॉप पार्ट है
रिकर्ड प्लंब

आपने लिखा था "यदि मैं स्क्रिप्ट के भीतर से उस लाइन को निष्पादित करता हूं तो यह स्क्रीन सेट करने के लिए नहीं लगता है"। तो स्टार्ट पार्ट काम करता है या नहीं? यदि ऐसा नहीं होता है, तो मेरी पहली टिप्पणी देखें।
गिल्स एसओ- बुराई को रोकना '28

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

अब हम कहीं जा रहे हैं। कृपया अपने सवाल को जानकारी के साथ अपडेट करें कि आप अनमेन्यू का उपयोग कैसे कर रहे हैं। और दो पंक्तियों को जोड़ने की कोशिश करते हैं #!/bin/bashऔर set -xस्क्रिप्ट के शीर्ष पर हैं, और हमें स्क्रिप्ट से उत्पादन का पता लगाने को दिखाते हैं। आपको यह पता लगाने की आवश्यकता हो सकती है कि आउटपुट कहां जाता है।
गिल्स एसओ- बुराई को रोकें '28

जवाबों:


40

मैं समस्या के कम से कम हिस्से को हल कर सकता हूं: क्यों stopभाग काम नहीं कर रहा है। प्रायोगिक तौर पर, जब आप अलग-अलग मोड में स्क्रीन सेशन शुरू करते हैं ( screen -d -m), कोई विंडो नहीं चुनी जाती है, इसलिए बाद में भेजा गया इनपुट screen -X stuffकेवल खो जाता है। आपको स्पष्ट रूप से निर्दिष्ट करना होगा कि आप कीस्ट्रोक्स को विंडो 0 ( -p 0) में भेजना चाहते हैं । यह वैसे भी एक अच्छा विचार है, यदि आप किसी कारण से उस स्क्रीन सत्र में अन्य विंडो बनाने के लिए होते हैं।

screen -S minecraft -p 0 -X stuff "stop^M"

(स्क्रीन ट्रांसलेशन ^Mकंट्रोल टू-एम जो Enterकुंजी द्वारा भेजा गया पात्र है ।)

स्क्रिप्ट से सत्र शुरू करने की समस्या अनमेनू से संबंधित है।


1
सुंदर, महान काम करता है (कम से कम कमांड लाइन से, बाद में लोगों को प्रहार करेगा)। ऐसा लगता है कि काफी लोगों ने इसे फेंक दिया है और इसका पहली बार मैंने कोई ठोस हल निकाला है। मेरी इच्छा है कि मेरे पास आपको वोट देने के लिए पर्याप्त बिंदु हों: D
richard plumb

धिक्कार है ** टी! यह काम करता है यहां तक ​​कि स्क्रीन पहले से ही संलग्न है, इसे पुन: व्यवस्थित किए बिना! सिस्टम में अन्य एप्लिकेशन से सरल ऐप्स को कमांड भेजने का एक शानदार तरीका क्या है। धन्यवाद! :)
ग्रेज़गोरज़ विएर्ज़ोवेकी

मुझे यह समस्या कभी नहीं हुई, शायद इसलिए कि मैंने हमेशा अपने स्क्रीन सत्र में कई (नाम वाली) खिड़कियां रखने की योजना बनाई है, और मैं हमेशा नाम से खिड़की चुनता हूं।
एकेवू

मैनुअल, संदर्भ के लिए: -X एक रनिंग स्क्रीन सत्र के लिए निर्दिष्ट कमांड भेजें। यदि आपके पास कई स्क्रीन सत्र चल रहे हैं, तो आप स्क्रीन सत्र को निर्दिष्ट करने के लिए -S विकल्प का उपयोग कर सकते हैं। आप केवल संलग्न या अलग किए गए स्क्रीन सत्रों को देखने के लिए स्क्रीन को बताने के लिए -d या -r विकल्प का उपयोग कर सकते हैं। ध्यान दें कि यदि सत्र पासवर्ड संरक्षित है तो यह कमांड काम नहीं करता है।
क्रिशवेबडेव

3
यह मेरे लिए काम नहीं करता है। मैंने एक स्क्रीन बनाई है screen -d -m -S hiऔर फिर चलाएं screen -S hi -p 0 -X stuff "cd <some_directory>^M"और परिणाम के रूप में कुछ भी प्राप्त न करें ... यह सिर्फ एक स्ट्रिंग के रूप में "cd <some_directory> ^ M" भेजता है और "^" की व्याख्या कुंजी के रूप में नहीं करता है ...
टान्नर स्ट्रंक

23

सबसे पहले, आसानी से newlines में प्रवेश करने पर एक नोट:

बस एक हेड अप है कि $()निर्माण कमांड के आउटपुट से नए सिरे से स्ट्रिप्स करता है ताकि आउटपुट लाइनों का उपयोग अन्य कार्यक्रमों के लिए तर्क के रूप में किया जा सके। इससे अप्रत्याशित व्यवहार हो सकता है। इस मामले में मुझे लगता है कि आप विशेष रूप से Enterकीस्ट्रोके के बराबर भेजने की कोशिश कर रहे हैं । जबकि आप जो वापसी गाड़ी भेज रहे हैं \r, वह धारीदार नहीं होगी, अतिरिक्त कमांड की आवश्यकता के बिना उस चरित्र में प्रवेश करने के कई आसान तरीके हैं।

  1. आप अपने दोहरे उद्धरण चिह्नों के अंदर एक नियमित रूप से नई पंक्ति लगा सकते हैं

    screen -S minecraft -X stuff "stop
    "
    
  2. या आप Ctrl+ v Enterअनुक्रम का उपयोग करके एक टर्मिनल लाइन में चरित्र दर्ज कर सकते हैं । यह ^Mटर्मिनल में कुछ दिखाई देगा , लेकिन यह एक विशेष न्यूलाइन वर्ण है।

    screen -S minecraft -X stuff "stop^M"
    

दूसरे, अनियमित स्क्रीन व्यवहार पर एक नोट। ( गिलेस द्वारा स्पष्टीकरण और समाधान )

स्क्रीन में स्क्रीन सत्र के लिए इनपुट स्वीकार करने के साथ एक समस्या है जिसे कभी संलग्न नहीं किया गया है। यदि आप इसे चलाते हैं तो यह विफल हो जाएगा:

screen -d -m -S minecraft zsh
screen -S minecraft -X stuff "stop^M"
screen -r minecraft

लेकिन अगर आप इसे चलाते हैं तो यह काम करेगा:

screen -d -m -S minecraft zsh
screen -r minecraft (then disconnect with Ctrl-a-d)
screen -S minecraft -X stuff "stop^M"
screen -r minecraft

अन्त में, आप tmuxइसके बजाय बेहतर व्यवहार का उपयोग कर सकते हैं screen

जीएनयू-स्क्रीन कई वर्षों से एक डी-फैक्टो टर्मिनल मल्टीप्लेक्स है, लेकिन इसे विकसित होने में लंबे समय तक नहीं रह गया है और बग और quirks तय नहीं हो रहे हैं। Tmux सक्रिय विकास के अंतर्गत है, इसमें कई विशेषताएं शामिल हैं जिन्हें स्क्रीन स्पर्श नहीं कर सकती है, और बॉक्स से बाहर इसका व्यवहार अधिक सहज है। इसके अलावा, यह बेहतर दस्तावेज है। यहां बताया गया है कि आप अपना कोड कैसे बदलेंगे:

# Start new detached tmux session with a named window pane running the java app
tmux new-session -d -n minecraft /usr/lib/java/bin/java [args]

# Send it keys to stop the mincraft server
tmux send-keys -t minecraft "stop^M"

अगर मैं स्क्रीन -r का उपयोग करके मैन्युअल रूप से स्विच करता हूं, तो मैं स्क्रीन देख सकता हूं, और इसमें कोई पाठ दर्ज नहीं किया गया है। भले ही गाड़ी वापसी असफल हो रही थी, फिर भी मुझे 'स्टॉप' टाइप करना चाहिए। लेकिन कुछ भी नहीं
रिकर्ड प्लंब

अगर मेरे पास एक पंक्ति में स्क्रीन -r के साथ एक स्क्रिप्ट है, और फिर स्क्रीन-एक्स सामान "स्टॉप ^ एम" है, तो यह सर्वर को बंद कर देता है, लेकिन 'एरर ऑकनटाउन ऑप्शन आर' के साथ भी शिकायत करता है
रिचार्ड प्लंब

मैंने स्क्रीन सेशन बनाकर यहां परीक्षण किया, फिर ऊपर दिए कमांड का उपयोग किया और यह पूरी तरह से काम करता है। क्या आप अपने स्क्रीन सत्र से कनेक्ट करने में सक्षम हैं screen -d -RR minecraft?
कालेब

हाँ, यह मुझे स्क्रीन से जोड़ता है। ऐसा स्क्रीन -r करता है। हैंग ऑन करें, अगर मैं स्क्रीन -S मिनीक्राफ्ट-एक्स स्टफ "स्टॉप ^ एम" की कोशिश करता हूं, तो मैन्युअल रूप से स्क्रीन -r, स्क्रीन में 'स्टॉप' टेक्स्ट है।
रीचर्ड प्लंब

मेरे लिये कार्य करता है। शायद आप में कुछ .screenrcफन्नी है या आपके पास उस नाम के साथ खुले हुए स्क्रीन सत्रों का एक गुच्छा है और इसलिए आप गलत डेटा भेज रहे हैं? screen -list?
कालेब

4

मैं इस पुरानी पोस्ट को खोदने के लिए माफी माँगता हूँ, लेकिन इससे मुझे अपने प्रयासों में मदद मिली होगी, यह जानकारी उस समय उपलब्ध थी जब मेरे पास एक समान मुद्दा था। बैश स्क्रिप्ट में स्क्रीन कमांड भेजने के तरीके के बारे में कई सवाल हैं। जैसा कि बिल्ली की खाल के साथ किया जा सकता है, लेकिन मुझे यह पसंद है। इसके साथ आप किसी भी कमांड को कह सकते हैं या कुछ भी कह सकते हैं केवल say_this फ़ंक्शन को कॉल करके।

#!/bin/bash

say_this()
{
    screen -S minecraft -p 0 -X stuff "$1^M"
}

say_this "say Saving world"
say_this "save-off"
say_this "save-all"
...

यह ssh के साथ है!

#!/bin/bash

say_this()
{
    # Dont forget to set NAME or whatever
    ssh -p 8989 192.168.1.101 screen -S $NAME -p 0 -X stuff \"$1^M\"
}

say_this "say test"
say_this "say !@#$%^&*()<>?This string will work!"

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