मेरे पास एक पाइथन लिपि है जो कई अलग-अलग स्क्रीन सत्रों का ट्रैक रखती है और प्रत्येक से आउटपुट कैप्चर करती है (जब फ्री, टॉप -बीएन 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
? क्या यह बच्चे की प्रक्रिया नहीं है?