Saya memiliki skrip python yang melacak banyak sesi layar terpisah dan menangkap output dari masing-masing (ketika perintah pemanfaatan seperti gratis, -bn2 atas, iostat secara berkala dikirim melalui 'barang').
Alih-alih mengarahkan ke file dan, dengan demikian, mengelola setidaknya satu file per sesi layar terpisah ... Saya hanya mengarahkan ke tty / pts apa pun yang digunakan sesi orang tua saya.
Langkah # 1: Mulai sesi layar baru (dengan nama yang dapat dibaca manusia) dalam mode terpisah.
$ screen -dmS chad
Langkah # 2: Kirim perintah Anda (saya akan menggunakan perintah 'free -g' bersama dengan 'uname -r') melalui barang. Penting untuk menentukan jendela yang ingin Anda gunakan (dalam kasus kami, jendela pertama dan satu-satunya) dengan -p.
$ screen -r chad -p0 -X stuff "free -g; uname -r"
Langkah # 3: Langkah di atas hanya mengirim teks perintah. Kita juga perlu mengirim carriage return ke sesi layar terpisah ini agar shell menjalankan perintah kita. Karakter ASCII 015 adalah carriage return pada kebanyakan sistem * nix.
$ screen -r chad -p0 -X eval "stuff \015"
Langkah # 4: Mengarahkan output sesi layar terpisah kami ke tty / pts kami saat ini:
$ screen -r chad -p0 -X hardcopy $(tty)
Output dari Langkah # 4 akan terlihat seperti ini:
$ 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
Meskipun ini tampaknya sedikit terlibat, prosesnya mudah skrip. Dengan python, saya dapat mengurai output dari Langkah # 4 dan hanya menangkap data yang saya pedulikan.
Memilih skenario sederhana seperti mengambil detail IP, saya menulis contoh skrip untuk menunjukkan konsep di atas. Jangan ragu untuk mengganti dan mengotak-atik sesuai keinginan Anda.
Contoh skrip python untuk mendapatkan detail IP dari sesi layar terpisah:
#!/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()
Skrip di atas beraksi:
$ python screen-output-test.py
inet addr:192.168.1.201 Bcast:192.168.1.255 Mask:255.255.255.0
screen
? Bukankah ini proses anak dibuat untuk apa?