Tôi có một tập lệnh python theo dõi nhiều phiên màn hình tách rời và thu được đầu ra từ mỗi (khi các lệnh sử dụng như free, top -bn2, iuler được định kỳ gửi qua 'Stuff').
Thay vì chuyển hướng đến một tệp và do đó, quản lý ít nhất một tệp cho mỗi phiên màn hình tách rời ... Tôi chỉ cần chuyển hướng đến bất kỳ tty / pts nào mà phiên cha mẹ tôi đang sử dụng.
Bước # 1: Bắt đầu một phiên màn hình mới (với tên người có thể đọc được) ở chế độ tách rời.
$ screen -dmS chad
Bước # 2: Gửi lệnh của bạn (Tôi sẽ sử dụng lệnh 'free -g' cùng với 'uname -r') thông qua công cụ. Điều quan trọng là chỉ định cửa sổ mà bạn muốn sử dụng (trong trường hợp của chúng tôi, cửa sổ đầu tiên và duy nhất) với -p.
$ screen -r chad -p0 -X stuff "free -g; uname -r"
Bước # 3: Bước trên chỉ gửi văn bản lệnh. Chúng tôi cũng cần phải gửi một trở lại vận chuyển đến phiên màn hình tách ra này để shell thực hiện lệnh của chúng tôi. Ký tự ASCII 015 là tiền hoàn trả trên hầu hết các hệ thống * nix.
$ screen -r chad -p0 -X eval "stuff \015"
Bước # 4: Chuyển hướng đầu ra của phiên màn hình tách rời sang tty / pts hiện tại của chúng tôi:
$ screen -r chad -p0 -X hardcopy $(tty)
Đầu ra của Bước # 4 sẽ trông giống như thế này:
$ 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
Mặc dù điều này có vẻ hơi liên quan, quá trình này dễ dàng được kịch bản. Với python, tôi có thể phân tích đầu ra của Bước # 4 và chỉ thu thập dữ liệu mà tôi quan tâm.
Chọn một kịch bản đơn giản như lấy chi tiết IP, tôi đã viết một kịch bản ví dụ để thể hiện các khái niệm ở trên. Hãy thay thế và tinker khi bạn thấy phù hợp.
Ví dụ tập lệnh python để lấy chi tiết IP từ phiên màn hình tách rời:
#!/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()
Kịch bản trên đang hoạt động:
$ python screen-output-test.py
inet addr:192.168.1.201 Bcast:192.168.1.255 Mask:255.255.255.0
screen
vậy? Đây không phải là những gì các quá trình con được thực hiện cho?