Tengo un script de Python que realiza un seguimiento de numerosas sesiones de pantalla separadas y captura la salida de cada una (cuando los comandos de utilización como free, top -bn2, iostat se envían periódicamente a través de 'cosas').
En lugar de redirigir a un archivo y, por lo tanto, administrar al menos un archivo por sesión de pantalla separada ... Simplemente redirijo a cualquier tty / pts que esté utilizando mi sesión principal.
Paso # 1: Comience una nueva sesión de pantalla (con un nombre legible por humanos) en modo separado.
$ screen -dmS chad
Paso # 2: envíe sus comandos (usaré el comando 'free -g' junto con 'uname -r') a través de cosas. Es importante especificar la ventana que desea usar (en nuestro caso, la primera y única ventana) con -p.
$ screen -r chad -p0 -X stuff "free -g; uname -r"
Paso # 3: El paso anterior solo envía el texto del comando. También debemos enviar un retorno de carro a esta sesión de pantalla separada para que el shell ejecute nuestro comando. El carácter ASCII 015 es un retorno de carro en la mayoría de los sistemas * nix.
$ screen -r chad -p0 -X eval "stuff \015"
Paso 4: redirige la salida de nuestra sesión de pantalla separada a nuestro tty / pts actual:
$ screen -r chad -p0 -X hardcopy $(tty)
El resultado del Paso 4 se verá más o menos así:
$ 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
Aunque esto parece un poco complicado, el proceso es fácilmente programable. Con python, puedo analizar el resultado del Paso # 4 y capturar solo los datos que me interesan.
Al elegir un escenario simple como obtener detalles de IP, escribí un script de ejemplo para demostrar los conceptos anteriores. Siéntase libre de reemplazar y retocar como mejor le parezca.
Ejemplo de secuencia de comandos de Python para obtener detalles de IP de una sesión de pantalla separada:
#!/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()
Guión anterior en acción:
$ python screen-output-test.py
inet addr:192.168.1.201 Bcast:192.168.1.255 Mask:255.255.255.0
screen
? ¿No es para esto que están hechos los procesos secundarios?