একটি বিচ্ছিন্ন স্ক্রিনে পাঠ্য ইনপুট প্রেরণ


44

আমি আমার আনরেড সার্ভারে একটি মাইনক্রাফ্ট সার্ভার চালানোর চেষ্টা করছি।

সার্ভারটি শেলটি চলবে এবং তারপরে ইনপুটটির জন্য অপেক্ষা করবে। এটি বন্ধ করতে, আমাকে 'স্টপ' টাইপ করতে হবে এবং এন্টার টিপতে হবে, এবং তারপরে এটি বিশ্বকে বাঁচাতে হবে এবং সান্ধ্যভাবে প্রস্থান করবে এবং আমি শেলের মধ্যে ফিরে আসছি। এটি সমস্ত কাজ করে যদি আমি এটি এনএএস বক্সে টেলনেটিংয়ের মাধ্যমে চালিত করি তবে আমি এটি সরাসরি বাক্সে চালাতে চাই।

এর আগে আমার প্রথম প্রচেষ্টা ছিল:

#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

এমকুনারেড হ'ল ফোল্ডার যেখানে আমার ক্রাফটবুককিট.জার এবং সমস্ত ওয়ার্ল্ড ফাইল ইত্যাদি রয়েছে আমি যদি সেই স্ক্রিন লাইনটি সরাসরি টাইপ করি তবে স্ক্রিনটি সেটআপ বিচ্ছিন্ন হয়ে যায় এবং সার্ভার চালু হয়। আমি যদি স্ক্রিপ্টের মধ্যে থেকে সেই লাইনটি কার্যকর করি তবে মনে হয় এটি কোনও স্ক্রীন সেট আপ করবে না

সার্ভারটি বন্ধ করার জন্য, আমাকে স্টপে 'টাইপ' করতে হবে এবং তারপরে এন্টার টিপুন। আমার পন্থা ছিল

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

স্ক্রিনে 'মাইনক্রাফ্ট' পাঠাতে পাঠ্য স্টপ এবং একটি ক্যারেজ রিটার্ন। তবে এটি কার্যকর হয় না, এমনকি যদি আমি এটি সরাসরি কমান্ড লাইনে টাইপ করি। তবে আমি যদি 'স্ক্রিন-আর' সার্ভারটি চালিয়ে স্ক্রিনে উঠতে পারি, তবে 'স্টপ' টাইপ করুন এবং এটি সঠিকভাবে বন্ধ হয়ে যায়।

সার্ভারটি ভালভাবে চালিত হয় যদি আমি এটিতে টেলনেট করি এবং ম্যানুয়ালি এটি করি তবে আমার দূরবর্তী কম্পিউটার থেকে সংযুক্ত না হয়ে কেবল এটি চালানো দরকার।


এটা ঠিক দেখাচ্ছে । স্ক্রিপ্টের সম্পূর্ণ সামগ্রী কী এবং আপনি কীভাবে এটি চালাচ্ছেন? এটি কোনও আউটপুট উত্পাদন করে? আপনি কীভাবে বলতে পারেন যে screenএটি শুরু করতে ব্যর্থ হয়েছে? set -xস্ক্রিপ্টের শীর্ষে ( #!লাইনের ঠিক পরে ) যুক্ত করার চেষ্টা করুন এবং স্ক্রিপ্টটি চালানোর সময় ট্রেস আউটপুটটি প্রতিবেদন করুন।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

এটি স্ক্রিপ্টের সম্পূর্ণ বিষয়বস্তু :) আমি এটি সরাসরি টাইপ করলে স্ক্রিন কমান্ড কাজ করে, তাই আমার মনে হয় আমার মূল সমস্যাটি স্টপ অংশ
রিচার্ড প্লাম্বের

আপনি লিখেছেন "আমি যদি স্ক্রিপ্টের মধ্যে থেকে সেই লাইনটি কার্যকর করি তবে মনে হয় এটি কোনও স্ক্রিন সেট আপ করে না"। তাহলে কি আর্ট স্টার্টটি কাজ করে নাকি? যদি তা না হয় তবে আমার প্রথম মন্তব্যটি দেখুন।
গিলস 'খারাপ হয়ে যাওয়া বন্ধ করুন'

আমি এটিকে আনমেনু ব্যবহারকারীর স্ক্রিপ্ট হিসাবে চালানোর চেষ্টা করছি। সেই সঠিক স্ক্রিন কমান্ডের সাথে যদি আমার কাছে ইউজার স্ক্রিপ্ট থাকে তবে কিছুই হয় না। যদি আমি কোনও টেলনেট উইন্ডোতে স্ক্রিন কমান্ডটি টাইপ করি তবে এটি আপনার প্রত্যাশা মতো একটি স্ক্রিনে সার্ভারটি চালু করে। সুতরাং আমি মনে করি কিছুটা পার্থক্য আছে যা আমি আনমেনু ব্যবহারকারীর স্ক্রিপ্টগুলি পরিচালনা করি সেভাবে বুঝতে পারি না।
রিচার্ড নদীর গভীরতানির্ণ

এখন আমরা কোথাও পাচ্ছি। আপনি কীভাবে আনমেনু ব্যবহার করছেন সে সম্পর্কে দয়া করে আপনার প্রশ্নটি আপডেট করুন। আর দুই লাইন যোগ করার চেষ্টা করি #!/bin/bashএবং set -xস্ক্রিপ্ট উপরের, এবং আমাদের স্ক্রিপ্ট থেকে আউটপুট ট্রেস প্রদর্শন করুন। সেই আউটপুটটি কোথায় চলেছে তা জানতে আপনাকে UNMU ডকুমেন্টেশন সন্ধান করতে হবে।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

উত্তর:


40

আমি সমস্যার অন্তত অংশটি সমাধান করতে পারি: কেন stopঅংশটি কাজ করছে না। পরীক্ষামূলকভাবে, আপনি যখন পৃথক মোডে স্ক্রিন সেশন শুরু করেন ( screen -d -m), কোনও উইন্ডো নির্বাচন করা হয় না, তাই পরে পাঠানো ইনপুটটি screen -X stuffকেবল হারিয়ে যায়। আপনাকে স্পষ্টভাবে উল্লেখ করতে হবে যে আপনি উইন্ডো 0 ( -p 0) তে কীস্ট্রোকগুলি প্রেরণ করতে চান । যাইহোক যাইহোক, আপনি যদি কোনও কারণেই সেই স্ক্রিন সেশনে অন্য উইন্ডোজ তৈরি করতে চান তবে এটি একটি ভাল ধারণা।

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

(স্ক্রিনটি অনুবাদ ^M-নিয়ন্ত্রণে অনুবাদ করে যা Enterকী দ্বারা প্রেরিত অক্ষর ))

স্ক্রিপ্ট থেকে সেশন শুরু করার সমস্যাটি সম্ভবত আনমেনু সম্পর্কিত।


1
সুন্দর, দুর্দান্ত কাজ করে (কমপক্ষে কমান্ড লাইন থেকে, পরে অমানুষের ছেলেগুলিকে ঠাট্টা করবে)। এটি বেশ কয়েকটি লোককে ফেলেছে বলে মনে হচ্ছে এবং প্রথমবারের মতো আমি কোনও দৃ concrete় সমাধান দেখেছি। আমি কেবল এই ইচ্ছুক যে আপনাকে ভোট দেওয়ার মতো আমার কাছে পর্যাপ্ত পরিমাণ রয়েছে: ডি
রিচার্ড প্লাম্বই

অভিশাপ ** টি! এটি এমনকি স্ক্রিনটিকে পুনরায় সংযুক্ত না করে ইতিমধ্যে সংযুক্ত করে কাজ করে! সিস্টেমের অন্যান্য অ্যাপ্লিকেশনগুলি থেকে সহজ অ্যাপ্লিকেশনগুলিতে কমান্ডগুলি প্রেরণের এক দুর্দান্ত উপায়। ধন্যবাদ! :)
গ্রজেগোর্জ ওয়েয়ারজোওইকি

আমার কখনই এই সমস্যা হয়নি, সম্ভবত আমি আমার স্ক্রিন সেশনে বেশ কয়েকটি (নামযুক্ত) উইন্ডো রাখার পরিকল্পনা করেছি এবং আমি সর্বদা নামে উইন্ডো বেছে নিই।
ইকভো

ম্যানুয়াল, রেফারেন্সের জন্য: -X চলমান স্ক্রিন সেশনে নির্দিষ্ট কমান্ডটি প্রেরণ করুন। আপনার বেশ কয়েকটি স্ক্রিন সেশন চলমান থাকলে আপনি স্ক্রিন সেশনটি নির্দিষ্ট করতে -S বিকল্পটি ব্যবহার করতে পারেন। আপনি কেবল সংযুক্ত বা বিচ্ছিন্ন স্ক্রিন সেশনগুলির জন্য দেখতে পর্দাটি জানাতে -d বা -r বিকল্পটি ব্যবহার করতে পারেন। নোট করুন যে সেশনটি পাসওয়ার্ড সুরক্ষিত থাকলে এই আদেশটি কাজ করে না।
KrisWebDev

3
এটি আমার পক্ষে কাজ করে না আমি এর সাথে একটি স্ক্রিন তৈরি করেছি screen -d -m -S hiএবং তারপরে চালাব screen -S hi -p 0 -X stuff "cd <some_directory>^M"এবং ফলস্বরূপ কিছুই পাবো না ... এটি কেবল "সিডি <some_directory> ^ এম" কে স্ট্রিং হিসাবে প্রেরণ করে এবং "enter এম" কে কী হিসাবে প্রবেশের কী হিসাবে ব্যাখ্যা করে না ...
ট্যানার স্ট্রঙ্ক

23

প্রথমত, সহজেই নতুন লাইনে প্রবেশের বিষয়ে একটি নোট:

$()কমান্ডের আউটপুট থেকে কনস্ট্রাক্ট নতুন লাইনগুলি স্ট্রিপ করে দেয় যাতে আউটপুট লাইনগুলি অন্যান্য প্রোগ্রামের আর্গুমেন্ট হিসাবে ব্যবহার করা যায় Just এটি অপ্রত্যাশিত আচরণের কারণ হতে পারে। এই ক্ষেত্রে আমি ধরে নিচ্ছি আপনি বিশেষত 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

জিএনইউ-স্ক্রিনটি বেশ কয়েক বছর ধরে একটি ডি-ফ্যাক্টো টার্মিনাল মাল্টিপ্লেক্সার, তবে এটি দীর্ঘদিন ধরে বিকাশ করা বন্ধ করে দিয়েছে এবং বাগ এবং কোরিকগুলি স্থির হচ্ছে না। টিএমাক্স সক্রিয় বিকাশের অধীনে রয়েছে, এমন অনেকগুলি বৈশিষ্ট্য অন্তর্ভুক্ত করে যা স্ক্রিনটি স্পর্শ করতে পারে না এবং বাক্সের বাইরে এর আচরণ বরং আরও স্বজ্ঞাত। এছাড়াও, এটি আরও ভাল নথিভুক্ত আপনি কীভাবে আপনার কোডটি রূপান্তর করবেন তা এখানে:

# 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"

আমি যদি ম্যানুয়ালি স্ক্রিন-আর ব্যবহার করে স্যুইচ করি তবে আমি স্ক্রিনটি দেখতে পাচ্ছি এবং কোনও পাঠ্যই প্রবেশ করানো হয়নি। এমনকি গাড়ীর রিটার্ন ব্যর্থ হলেও, আমার এখনও 'স্টপ' টাইপ করা উচিত But তবে কিছুই না
রিচার্ড প্লাম্বের

যদি আমার কাছে এক লাইনে স্ক্রিন-আর এর সাথে স্ক্রিপ্ট থাকে এবং তারপরে স্ক্রিন-এক্স স্টাফ "স্টপ এম এম" করে তবে এটি সার্ভারটি বন্ধ করে দেয়, তবে 'ত্রুটিযুক্ত জ্ঞাত বিকল্প r' এর সাথেও অভিযোগ করে
রিচার্ড

আমি এখানে স্ক্রিন সেশন তৈরি করে পরীক্ষা করেছি, তারপরে উপরের কমান্ডটি ব্যবহার করে এটি পুরোপুরি কার্যকর হয়। আপনি কি ব্যবহার করে আপনার স্ক্রিন সেশনে সংযোগ রাখতে সক্ষম screen -d -RR minecraft?
কালেব

হ্যাঁ, এটি আমাকে স্ক্রিনে সংযুক্ত করে। স্ক্রীন-আর .. হ্যাং থাকুন, যদি আমি স্ক্রিন-মিনক্রাফট-এক্স স্টাফ "স্টপ এম এম" চেষ্টা করি তবে ম্যানুয়ালি স্ক্রিন -আর, স্ক্রিনে 'স্টপ' পাঠ্য রয়েছে।
রিচার্ড প্লাম্বি

আমার জন্য কাজ কর. আপনার নিজের মধ্যে সম্ভবত কিছু .screenrcচমকপ্রদ কিছু আছে বা আপনার কাছে সেই নামটি দিয়ে খোলা কিছু পর্দা সেশন খোলা আছে এবং তাই আপনি কোনও ভুলতে ডেটা প্রেরণ করছেন? screen -list?
কালেব

4

আমি এই পুরাতন পোস্টটি খননের জন্য ক্ষমা চাইছি, তবে আমার অনুরূপ সমস্যা হওয়ার সময় এই তথ্যটি উপস্থিত থাকলে এটি আমার প্রয়াসে সহায়তা করবে। ব্যাশ স্ক্রিপ্টে স্ক্রিন কমান্ড কীভাবে প্রেরণ করা যায় সে সম্পর্কে অনেক প্রশ্ন রয়েছে। বিড়ালের চামড়ার সাথে এটিও করা হতে পারে তবে আমি এইভাবে পছন্দ করি। এটির সাহায্যে আপনি যে কোনও আদেশ পাঠাতে পারেন বা কেবল_এই ফাংশনটি কল করে কিছু বলতে পারেন।

#!/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!"

সুন্দর এবং সংক্ষিপ্ত ... ইউ ও এল
eyoung100
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.