Ich habe ein Python-Skript, das zahlreiche getrennte Bildschirmsitzungen verfolgt und die Ausgabe von jeder erfasst (wenn Verwendungsbefehle wie free, top -bn2, iostat regelmäßig über 'stuff' gesendet werden).
Anstatt zu einer Datei umzuleiten und somit mindestens eine Datei pro getrennter Bildschirmsitzung zu verwalten, leite ich einfach zu den von meiner übergeordneten Sitzung verwendeten tty / pts um.
Schritt 1: Starten Sie eine neue Bildschirmsitzung (mit einem für Menschen lesbaren Namen) im getrennten Modus.
$ screen -dmS chad
Schritt 2: Senden Sie Ihre Befehle (ich verwende den Befehl 'free -g' zusammen mit 'uname -r') über Zeug. Es ist wichtig, das zu verwendende Fenster (in unserem Fall das erste und einzige Fenster) mit -p anzugeben.
$ screen -r chad -p0 -X stuff "free -g; uname -r"
Schritt 3: Der obige Schritt sendet nur den Befehlstext. Wir müssen auch einen Wagenrücklauf an diese getrennte Bildschirmsitzung senden, damit die Shell unseren Befehl ausführt. Das ASCII-Zeichen 015 ist auf den meisten * nix-Systemen ein Wagenrücklauf.
$ screen -r chad -p0 -X eval "stuff \015"
Schritt 4: Leiten Sie die Ausgabe unserer getrennten Bildschirmsitzung auf unsere aktuellen tty / pts um:
$ screen -r chad -p0 -X hardcopy $(tty)
Die Ausgabe von Schritt 4 sieht ungefähr so aus:
$ 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
Obwohl dies ein bisschen kompliziert zu sein scheint, ist der Prozess leicht skriptfähig. Mit Python kann ich die Ausgabe von Schritt 4 analysieren und nur die Daten erfassen, die mir wichtig sind.
Ich entschied mich für ein einfaches Szenario wie das Abrufen von IP-Details und schrieb ein Beispielskript, um die obigen Konzepte zu demonstrieren. Fühlen Sie sich frei zu ersetzen und zu basteln, wie Sie es für richtig halten.
Beispiel eines Python-Skripts zum Abrufen von IP-Details aus einer getrennten Bildschirmsitzung:
#!/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()
Über dem Skript in Aktion:
$ python screen-output-test.py
inet addr:192.168.1.201 Bcast:192.168.1.255 Mask:255.255.255.0
screen
? Ist das nicht das, wofür untergeordnete Prozesse gemacht sind?