বিচ্ছিন্ন স্ক্রিনে আদেশ পাঠান এবং আউটপুট পান


12

আমি বিচ্ছিন্ন স্ক্রিন সেশনে একটি কমান্ড প্রেরণের উপায় সন্ধান করছি। এ পর্যন্ত সব ঠিকই. এটিই আমি নিয়ে এসেছি:

$ screen -S test -p 0 -X stuff 'command\n'

এই কমান্ডটি এটি করা উচিত হিসাবে কাজ করে। তবে, আমি এটি থেকে আউটপুটটিও চাই, সরাসরি আমার চোখের সামনে প্রতিধ্বনিত হয়েছিল (কোনও .logফাইল বা কোনও কিছুর প্রয়োজন নেই , আমি কেবল আউটপুট চাই)।

screen -Lকমান্ডটি ব্যবহার করা কোনও বিকল্প নয়।


কেন হতে হবে screen? এটি কি শিশু প্রসেসগুলির জন্য তৈরি হয় না?
আনকো

উত্তর:


10

প্রথমে প্রথম আউট পাইপ ব্যবহার করুন:

mkfifo /tmp/test

একটি পুনর্নির্দেশ অপারেটর ব্যবহার করুন। কমান্ডের আউটপুটটিকে / tmp / test এ পুনঃনির্দেশ করুন উদাহরণস্বরূপ:

screen -S test -p 0 -X stuff 'command >/tmp/test\n'

তারপরে আর একটি শেল

tail -f /tmp/test.

দ্রষ্টব্য আপনি 2> ও 1 অপারেটর ব্যবহার করে ত্রুটি বার্তাগুলি পুনর্নির্দেশ করতেও পারেন ।

উদাহরণ

মন্তব্যে অনুরোধ করা হয়েছে, ধরে নেওয়া যাক আমাদের কাছে একটি পিএইচপি স্ক্রিপ্ট রয়েছে যা ব্যবহারকারী ইনপুট গ্রহণ করে এবং "স্থিতি" এর ইনপুটটিতে সার্ভার লোড প্রিন্ট করে:

# cat test.php
<?php
  $fp=fopen("php://stdin","r");
  while($line=stream_get_line($fp,65535,"\n")) 
  {
    if ($line=="status") {echo "load is stub";} 
  } 
  fclose($fp);
?>

আপনি দুটি ফিফো তৈরি করুন:

 # mkfifo /tmp/fifoin /tmp/fifoout

আপনি একটি স্ক্রিন কল:

screen

অন্য কনসোলে, আসুন এটির কনসোল 2 কল করুন আপনি নিজের স্ক্রিনের নামটি খুঁজে পান:

# screen -ls
There is a screen on:
        8023.pts-3.tweedleburg  (Attached)
1 Socket in /var/run/screens/S-root.

কনসোল 2 এ আপনি পর্দায় কমান্ডটি প্রেরণ করুন:

 # screen -S 8023.pts-3.tweedleburg -p 0 -X stuff 'php test.php </tmp/fifoin >/tmp/fifoout\n'

আপনি কমান্ডটি পর্দায় উপস্থিত দেখবেন। এখন কনসোল 2 এ আপনি আপনার পিএইচপি প্রক্রিয়াতে আদেশগুলি পাঠাতে পারেন:

echo "status" >/tmp/fifoin

এবং এটি থেকে পড়ুন:

# cat /tmp/fifoout
load is stub

1
দুঃখিত, কিন্তু এটি কাজ করে না। আমি যদি কমান্ডকে 'কমান্ড> / টিএমপি / টেস্ট' এর মতো কমান্ড প্রেরণ করি তবে প্রক্রিয়াটি অবশ্যই> / tmp / পরীক্ষার বাক্য গঠন সমর্থন করে ... এবং তা হয় না।
রবিন

আমার জন্য এটি কাজ করে, দয়া করে নোট করুন যে আমি আপনার পর্দার নাম হিসাবে "পরীক্ষা" রেখেছি। কমান্ড স্ক্রিন-এলএস সহ আপনি আপনার স্ক্রিনের নাম জানতে পারেন। এছাড়াও, "কমান্ড" আপনার আসল কমান্ড দ্বারা প্রতিস্থাপন করা উচিত, আমি ls কমান্ড দিয়ে পরীক্ষা করেছি। এছাড়াও, আমি ব্যাশ শেল দিয়ে পরীক্ষা করেছি।
থারস্টেন স্টার্ক

আমি জানি। এবং এটি কাজ করে না। উদাহরণস্বরূপ, একটি স্ক্রিন উইন্ডোতে পিএইচপি স্ক্রিপ্ট শুরু করুন, যা উদাহরণস্বরূপ, একটি আদেশ "স্ট্যাটাস" সাড়া দেয়, যা বর্তমান সার্ভার লোডকে উদাহরণস্বরূপ প্রদান করে returns এটাই আমি করার চেষ্টা করছি।
রবিন

তারপরে আপনার দ্বি
নির্দেশমূলক

6

আমার কাছে একটি অজগর স্ক্রিপ্ট রয়েছে যা অসংখ্য বিচ্ছিন্ন স্ক্রিন সেশনগুলির উপর নজর রাখে এবং প্রতিটি থেকে আউটপুট ক্যাপচার করে (যখন ফ্রি, টপ-বিএন 2, আইওস্ট্যাটের মতো ইউজুয়ালাইজেশন কমান্ডগুলি পর্যায়ক্রমে ' স্টাফ'- এর মাধ্যমে প্রেরণ করা হয়)।

কোনও ফাইলে পুনর্নির্দেশের পরিবর্তে এবং এইভাবে, বিযুক্ত স্ক্রিন সেশন অনুযায়ী কমপক্ষে একটি ফাইল পরিচালনা করা ... আমি আমার পিতামাতার অধিবেশনটি যেটি tty / pts ব্যবহার করছে তা কেবল পুনঃনির্দেশ করি।

পদক্ষেপ # 1: বিচ্ছিন্ন মোডে একটি নতুন স্ক্রিন সেশন (একটি মানব পাঠযোগ্য নাম সহ) শুরু করুন।

$ screen -dmS chad 

পদক্ষেপ # 2: আপনার আদেশগুলি প্রেরণ করুন (আমি 'আনমে -আর' সহ 'ফ্রি-জি' কমান্ডটি ব্যবহার করব)। আপনি যে উইন্ডোটি ব্যবহার করতে চান তা নির্দিষ্ট করে দেওয়া গুরুত্বপূর্ণ (আমাদের ক্ষেত্রে, প্রথম এবং একমাত্র উইন্ডো) -p দিয়ে।

$ screen -r chad -p0 -X stuff "free -g; uname -r" 

পদক্ষেপ # 3: উপরের পদক্ষেপটি কেবল কমান্ড পাঠ্য প্রেরণ করে। শেলটি আমাদের কমান্ডটি কার্যকর করতে আমাদের এই বিযুক্ত স্ক্রিন সেশনে একটি ক্যারেজ রিটার্নও পাঠাতে হবে। ASCII অক্ষর 015 হল বেশিরভাগ * নিক্স সিস্টেমে একটি ক্যারেজ রিটার্ন।

$ screen -r chad -p0 -X eval "stuff \015"

পদক্ষেপ # 4: আমাদের বিচ্ছিন্ন স্ক্রিন সেশনের আউটপুটটিকে আমাদের বর্তমান tty / pts এ পুনঃনির্দেশ করুন:

$ screen -r chad -p0 -X hardcopy $(tty)

পদক্ষেপ # 4 এর আউটপুট এরকম কিছু দেখবে:

$ free -g; uname -r
             total       used       free     shared    buffers     cached
Mem:             7          1          6          0          0          0
-/+ buffers/cache:          0          7
Swap:            1          0          1
2.6.32-358.el6.x86_64

যদিও এটি কিছুটা জড়িত বলে মনে হচ্ছে, প্রক্রিয়াটি সহজেই লিপিযোগ্য। অজগর দিয়ে, আমি পদক্ষেপ # 4 এর আউটপুটকে বিশ্লেষণ করতে পারি এবং কেবল আমার যত্ন নেওয়া ডেটা ক্যাপচার করতে পারি।

আইপি বিশদ দখল করার মতো একটি সাধারণ দৃশ্যের চয়ন করে, আমি উপরের ধারণাগুলি প্রদর্শনের জন্য একটি উদাহরণ স্ক্রিপ্ট লিখেছিলাম। আপনি উপযুক্ত হিসাবে প্রতিস্থাপন এবং টিঙ্কার নির্দ্বিধায়।

বিচ্ছিন্ন স্ক্রিন সেশন থেকে আইপি বিশদ পেতে পাইথন স্ক্রিপ্ট উদাহরণ:

#!/usr/bin/python

import pexpect, time

#spawn a new bash session
session = pexpect.spawn('/bin/bash')
#send screen commands
session.sendline('screen -dmS netIP')
session.sendline('screen -r netIP -p0 -X stuff "ifconfig eth0 | grep -v eth0 | head -1"')
session.sendline('screen -r netIP -p0 -X eval "stuff \\015"')
#give the command a chance to execute before reading the output of our detached screen
time.sleep(0.1)

#use the output of the uname command as our string to expect
session.sendline('screen -r netIP -p0 -X hardcopy $(tty); $(uname)')
session.expect('Linux')

#parse the output - only concerned with the 'inet' line
output = session.before.split('\n')
for o in output:
    if 'inet' in o:
        print o

#kill the screen
session.sendline('screen -r netIP -p0 -X quit')
time.sleep(0.1)

session.close()

কার্যক্রমে উপরে স্ক্রিপ্ট:

$ python screen-output-test.py 
      inet addr:192.168.1.201  Bcast:192.168.1.255  Mask:255.255.255.0

আমি এই উত্তরটি গ্রহণযোগ্য উত্তরটির চেয়ে অনেক বেশি পছন্দ করি কারণ এটি "শেল প্রম্পট" অবস্থায় থাকা পর্দার উপর নির্ভর করে না, তবে সেই স্ক্রিনে যা চলছে তা নিয়ে কাজ করে।
গুট্রাম ব্লহম

যাইহোক, এটি স্ক্রিনে ফিট করার জন্য আউটপুটটিকে পুনরুদ্ধার করে। আমি খুঁজে পেয়েছি screen -X logfile /tmp/something; screen -X log on; screen -X stuff "command param"; screen -X log offযে পরিস্থিতিতে আরও ভাল কাজ।
গুন্ট্রাম ব্লহম

-1
screen -S myscreen

screen -R myscreen -X exec command

উদাহরণ:

screen -R myscreen -X exec top
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.