ฉันมีสคริปต์ไพ ธ อนที่ติดตามเซสชันหน้าจอที่แยกออกมาจำนวนมากและจับเอาท์พุทจากแต่ละรายการ (เมื่อคำสั่งการใช้ประโยชน์เช่นฟรี, -bn2 ด้านบน, iostatจะถูกส่งเป็นระยะ ๆ ผ่าน 'เนื้อหา')
แทนที่จะเปลี่ยนเส้นทางไปยังไฟล์และดังนั้นการจัดการอย่างน้อยหนึ่งไฟล์ต่อเซสชันหน้าจอที่แยกออก ... ฉันเพียงแค่เปลี่ยนเส้นทางไปยังสิ่งที่ tty / pts เซสชันแม่ของฉันใช้
ขั้นตอนที่ 1:เริ่มเซสชันหน้าจอใหม่ (ด้วยชื่อที่มนุษย์สามารถอ่านได้) ในโหมดเดี่ยว
$ screen -dmS chad
ขั้นตอนที่ # 2:ส่งคำสั่งของคุณ (ฉันจะใช้คำสั่ง 'free -g' พร้อมกับ 'uname -r') ผ่านทางสิ่งต่าง ๆ เป็นสิ่งสำคัญที่จะต้องระบุหน้าต่างที่คุณต้องการใช้ (ในกรณีของเราหน้าต่างแรกและหน้าต่างเดียว) ด้วย -p
$ screen -r chad -p0 -X stuff "free -g; uname -r"
ขั้นตอนที่ # 3:ขั้นตอนข้างต้นส่งข้อความคำสั่งเท่านั้น เราต้องส่ง carriage return ไปยังเซสชันหน้าจอที่แยกออกนี้เพื่อให้เชลล์ดำเนินการคำสั่งของเรา อักขระ ASCII 015 คือ carriage return บนระบบ * 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 และจับเฉพาะข้อมูลที่ฉันสนใจ
การเลือกสถานการณ์อย่างง่าย ๆ เช่นการจับรายละเอียด IP ฉันเขียนสคริปต์ตัวอย่างเพื่อแสดงแนวคิดดังกล่าวข้างต้น รู้สึกอิสระที่จะเปลี่ยนและคนจรจัดตามที่เห็นสมควร
ตัวอย่างสคริปต์ python เพื่อรับรายละเอียด IP จากหน้าจอที่แยกออก:
#!/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
? นี่ไม่ใช่สิ่งที่กระบวนการลูกทำขึ้นมาเพื่อ?