Ben çok sayıda müstakil ekran oturumları izler ve her çıkış çıktıları ( ücretsiz, top -bn2, iostat gibi periyodik 'şeyler' yoluyla gönderilir) yakalar bir python komut dosyası var .
Bir dosyaya yönlendirme yapmak ve bu nedenle, ayrı ekran oturumu başına en az bir dosya yönetmek yerine ... Üst oturumumun kullandığı tty / pts'ye yönlendiriyorum.
Adım # 1: Ayrı modda yeni bir ekran oturumu başlatın (insan tarafından okunabilir bir adla).
$ screen -dmS chad
Adım # 2: Komutlarınızı gönderin ('free -g' komutunu 'uname -r' ile birlikte kullanacağım). -P ile kullanmak istediğiniz pencereyi (bizim durumumuzda, ilk ve tek pencere) belirtmek önemlidir.
$ screen -r chad -p0 -X stuff "free -g; uname -r"
Adım # 3: Yukarıdaki adım sadece komut metnini gönderir. Kabuğun komutumuzu yürütmesi için bu ayrılmış ekran oturumuna bir satır başı göndermemiz de gerekir. ASCII karakteri 015, çoğu * nix sistemde satır başıdır.
$ screen -r chad -p0 -X eval "stuff \015"
Adım # 4: Ayrılmış ekran oturumumuzun çıktısını mevcut tty / puanlarımıza yeniden yönlendirin:
$ screen -r chad -p0 -X hardcopy $(tty)
Adım # 4'ün çıktısı şöyle görünecektir:
$ 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
Bu biraz dahil gibi görünse de, süreç kolayca yazılabilir. Python ile Adım # 4'ün çıktısını ayrıştırabilir ve yalnızca önem verdiğim verileri yakalayabilirim.
IP detaylarını yakalamak gibi basit bir senaryo seçerken, yukarıdaki kavramları göstermek için örnek bir senaryo yazdım. Uygun gördüğünüz gibi değiştirin ve tamir edin.
Ayrılmış ekran oturumundan IP ayrıntılarını almak için örnek python betiğ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()
Uygulamadaki komut dosyasının üstünde:
$ python screen-output-test.py
inet addr:192.168.1.201 Bcast:192.168.1.255 Mask:255.255.255.0
screen
? Çocuk süreçleri bunun için yapılmadı mı?