अलग स्क्रीन पर कमांड भेजें और आउटपुट प्राप्त करें


12

मैं एक अलग स्क्रीन सत्र के लिए एक कमांड भेजने का एक तरीका खोजने के लिए खोज रहा हूं। अब तक सब ठीक है। यह वही है जो मैं लेकर आया हूं:

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

यह कमांड उसी तरह काम करता है, जैसा उसे करना चाहिए। लेकिन, मैं इससे आउटपुट भी चाहूंगा, सीधे मेरी आंखों के सामने गूँज उठेगा (किसी .logफ़ाइल या किसी चीज़ की ज़रूरत नहीं , मुझे बस आउटपुट चाहिए)।

screen -Lकमांड का उपयोग करना , एक विकल्प नहीं है।


क्यों होना पड़ता है screen? क्या यह बच्चे की प्रक्रिया नहीं है?
एको

जवाबों:


10

पहली बार पहले पाइप का उपयोग करें:

mkfifo /tmp/test

पुनर्निर्देशित ऑपरेटर का उपयोग करें। उदाहरण के लिए / tmp / परीक्षण के लिए कमांड के आउटपुट को पुनर्निर्देशित करें:

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

फिर दूसरे शेल में

tail -f /tmp/test.

नोट आप 2> और 1 ऑपरेटर का उपयोग करके त्रुटि संदेशों को पुनर्निर्देशित करना चाह सकते हैं ।

उदाहरण

जैसा कि टिप्पणियों में अनुरोध किया गया है, मान लें कि हमारे पास उपयोगकर्ता इनपुट स्वीकार करने और "स्थिति" के इनपुट पर सर्वर लोड को प्रिंट करने के लिए एक php स्क्रिप्ट है:

# 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 में आप अपने php प्रोसेस को कमांड भेज सकते हैं:

echo "status" >/tmp/fifoin

और इसे पढ़ें:

# cat /tmp/fifoout
load is stub

1
क्षमा करें, लेकिन यह काम नहीं करता है। अगर मैं 'कमांड> / tmp / test' जैसे creen को कमांड भेज रहा हूं, तो प्रक्रिया को> / tmp / test सिंटैक्स का समर्थन करना चाहिए ... और यह नहीं करता है।
रॉबिन

मेरे लिए यह काम करता है, कृपया ध्यान दें कि मैंने "परीक्षण" को आपकी स्क्रीन के नाम के रूप में रखा है। आप कमांड स्क्रीन-पर्ल के साथ अपनी स्क्रीन का नाम पता कर सकते हैं। इसके अलावा, "कमांड" को आपके वास्तविक कमांड द्वारा प्रतिस्थापित किया जाना चाहिए, मैंने कमांड एलएस के साथ परीक्षण किया। इसके अलावा, मैंने बैश शेल के साथ परीक्षण किया।
थोरस्टेन स्टैक

मुझे पता है। और यह काम नहीं करता है। उदाहरण के लिए, एक स्क्रीन विंडो में PHP स्क्रिप्ट शुरू करें, जो, उदाहरण के लिए, एक कमांड "स्थिति" का जवाब देता है, जो उदाहरण के लिए वर्तमान सर्वर लोड लौटाता है। यही मैं करने की कोशिश कर रहा हूं।
रॉबिन

फिर आपको द्विदिश पाइपों की आवश्यकता होगी, मैं इसे अपने उत्तर में जोड़ रहा हूं
थोरस्टेन स्टैक

6

मेरे पास एक पाइथन लिपि है जो कई अलग-अलग स्क्रीन सत्रों का ट्रैक रखती है और प्रत्येक से आउटपुट कैप्चर करती है (जब फ्री, टॉप -बीएन 2, आईओस्टाट जैसे उपयोगिता कमांड समय-समय पर 'सामान' के माध्यम से भेजे जाते हैं)।

किसी फ़ाइल पर पुनर्निर्देशित करने के बजाय और इस प्रकार, कम से कम एक फ़ाइल को अलग किए गए स्क्रीन सत्र के लिए प्रबंधित करना ... मैं बस अपने मूल सत्र का उपयोग कर रहे tty / pts को जो कुछ भी करता हूं, उसे पुनर्निर्देशित करता हूं।

चरण # 1: अलग किए गए मोड में एक नया स्क्रीन सत्र (एक मानव पठनीय नाम के साथ) शुरू करें।

$ screen -dmS chad 

चरण # 2: अपनी कमांड भेजें (मैं 'un -r' के साथ 'free -g' कमांड का उपयोग करूँगा) सामान के माध्यम से। -P के साथ उस विंडो को निर्दिष्ट करना महत्वपूर्ण है जिसे आप (हमारे मामले में, पहली और एकमात्र खिड़की) का उपयोग करना चाहते हैं।

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

चरण # 3: उपरोक्त चरण केवल कमांड पाठ भेजता है। हमें इस अलग किए गए स्क्रीन सेशन में कैरिज रिटर्न भेजने की भी जरूरत है ताकि शेल हमारे कमांड को निष्पादित कर सके। ASCII वर्ण 015 अधिकांश * nix सिस्टम पर एक गाड़ी वापसी है।

$ 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उस परिदृश्य में और भी बेहतर काम करने के लिए।
गुंटराम ब्लोह

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