Ho uno script Python che tiene traccia di numerose sessioni a schermo staccato e cattura l'output di ciascuna (quando i comandi di utilizzo come free, top -bn2, iostat vengono periodicamente inviati tramite 'roba').
Invece di reindirizzare a un file e, quindi, gestire almeno un file per sessione schermo distaccata ... Devo semplicemente reindirizzare a qualunque tty / pts la mia sessione padre stia usando.
Passaggio n. 1: avvia una nuova sessione schermo (con un nome leggibile) in modalità staccata.
$ screen -dmS chad
Step # 2: Invia i tuoi comandi (userò il comando 'free -g' insieme a 'uname -r') tramite roba. È importante specificare la finestra che si desidera utilizzare (nel nostro caso, la prima e unica finestra) con -p.
$ screen -r chad -p0 -X stuff "free -g; uname -r"
Passaggio n. 3: il passaggio precedente invia solo il testo del comando. Dobbiamo anche inviare un ritorno a capo a questa sessione schermo distaccato per fare in modo che la shell esegua il nostro comando. Il carattere ASCII 015 è un ritorno a capo sulla maggior parte dei sistemi * nix.
$ screen -r chad -p0 -X eval "stuff \015"
Passaggio n. 4: reindirizzare l'output della nostra sessione di schermo staccato ai nostri tty / pts attuali:
$ screen -r chad -p0 -X hardcopy $(tty)
L'output del passaggio n. 4 avrà un aspetto simile al seguente:
$ 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
Anche se questo sembra un po 'coinvolto, il processo è facilmente gestibile tramite script. Con Python, posso analizzare l'output del passaggio n. 4 e acquisire solo i dati che mi interessano.
Scegliendo uno scenario semplice come afferrare i dettagli IP, ho scritto uno script di esempio per dimostrare i concetti sopra. Sentiti libero di sostituire e armeggiare come meglio credi.
Esempio di script Python per ottenere i dettagli IP da una sessione schermo distaccata:
#!/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()
Sopra lo script in azione:
$ python screen-output-test.py
inet addr:192.168.1.201 Bcast:192.168.1.255 Mask:255.255.255.0
screen
? Non è per questo che sono fatti i processi figlio?