Mam skrypt w języku Python, który śledzi wiele odłączonych sesji ekranowych i przechwytuje dane wyjściowe z każdej z nich (gdy polecenia użycia, takie jak free, top -bn2, iostat, są okresowo wysyłane przez „rzeczy”).
Zamiast przekierowywać do pliku, a tym samym zarządzać co najmniej jednym plikiem dla każdej odłączonej sesji ekranowej ... Po prostu przekierowuję do dowolnego tty / pts, którego używa moja sesja nadrzędna.
Krok # 1: Rozpocznij nową sesję ekranu (z czytelną dla człowieka nazwą) w trybie odłączonym.
$ screen -dmS chad
Krok # 2: Wyślij swoje polecenia (użyję polecenia „free -g” wraz z „uname -r”) za pośrednictwem różnych rzeczy. Ważne jest, aby określić okno, którego chcesz użyć (w naszym przypadku pierwsze i jedyne okno) za pomocą -p.
$ screen -r chad -p0 -X stuff "free -g; uname -r"
Krok # 3: Powyższy krok wysyła tylko tekst polecenia. Musimy również wysłać powrót karetki do tej odłączonej sesji ekranu, aby powłoka wykonała nasze polecenie. Znak ASCII 015 jest znakiem powrotu karetki w większości systemów * nix.
$ screen -r chad -p0 -X eval "stuff \015"
Krok # 4: Przekieruj wyjście z naszej odłączonej sesji ekranu do naszego obecnego tty / pts:
$ screen -r chad -p0 -X hardcopy $(tty)
Wynik kroku 4 będzie wyglądał mniej więcej tak:
$ 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
Chociaż wydaje się to trochę skomplikowane, proces ten można łatwo wykonać za pomocą skryptów. Za pomocą Pythona mogę analizować dane wyjściowe z kroku 4 i przechwytywać tylko te dane, na których mi zależy.
Wybierając prosty scenariusz, na przykład zbieranie szczegółów adresu IP, napisałem przykładowy skrypt, aby zademonstrować powyższe pojęcia. Zapraszam do wymiany i majsterkowania, kiedy uznasz to za stosowne.
Przykładowy skrypt Pythona, aby uzyskać szczegóły IP z odłączonej sesji ekranu:
#!/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()
Powyższy skrypt w akcji:
$ python screen-output-test.py
inet addr:192.168.1.201 Bcast:192.168.1.255 Mask:255.255.255.0
screen
? Czy nie po to są tworzone procesy potomne?