Eu tenho um script python que monitora várias sessões de tela desanexada e captura a saída de cada uma (quando comandos de utilização como free, top -bn2, iostat são enviados periodicamente via 'stuff').
Em vez de redirecionar para um arquivo e, assim, gerenciar pelo menos um arquivo por sessão de tela desanexada ... Simplesmente redireciono para qualquer tty / pts que minha sessão pai esteja usando.
Etapa 1: inicie uma nova sessão de tela (com um nome legível por humanos) no modo desanexado.
$ screen -dmS chad
Etapa 2: Envie seus comandos (usarei o comando 'free -g' junto com 'uname -r') via material. É importante especificar a janela que você deseja usar (no nosso caso, a primeira e única janela) com -p.
$ screen -r chad -p0 -X stuff "free -g; uname -r"
Etapa 3: A etapa acima envia apenas o texto do comando. Também precisamos enviar um retorno de carro para esta sessão de tela desanexada para que o shell execute nosso comando. O caractere ASCII 015 é um retorno de carro na maioria dos sistemas * nix.
$ screen -r chad -p0 -X eval "stuff \015"
Etapa # 4: Redirecione a saída de nossa sessão de tela desanexada para nossos atuais tty / pts:
$ screen -r chad -p0 -X hardcopy $(tty)
A saída da Etapa 4 será mais ou menos assim:
$ 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
Embora isso pareça um pouco envolvido, o processo é facilmente programável. Com o python, eu posso analisar a saída da Etapa 4 e capturar apenas os dados que me interessam.
Escolhendo um cenário simples como obter detalhes de IP, escrevi um exemplo de script para demonstrar os conceitos acima. Sinta-se livre para substituir e mexer como achar melhor.
Exemplo de script python para obter detalhes de IP de uma sessão de tela desanexada:
#!/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()
Script acima em ação:
$ python screen-output-test.py
inet addr:192.168.1.201 Bcast:192.168.1.255 Mask:255.255.255.0
screen
? Não é para isso que os processos filhos são feitos?