J'ai un script python qui garde la trace de nombreuses sessions d'écran détachées et capture la sortie de chacune (lorsque les commandes d'utilisation comme free, top -bn2, iostat sont périodiquement envoyées via «stuff»).
Au lieu de rediriger vers un fichier et, par conséquent, de gérer au moins un fichier par session d'écran détachée ... Je redirige simplement vers ce que tty / pts ma session parent utilise.
Étape # 1: Démarrez une nouvelle session d'écran (avec un nom lisible par l'homme) en mode détaché.
$ screen -dmS chad
Étape # 2: Envoyez vos commandes (j'utiliserai la commande 'free -g' avec 'uname -r') via stuff. Il est important de spécifier la fenêtre que vous souhaitez utiliser (dans notre cas, la première et la seule fenêtre) avec -p.
$ screen -r chad -p0 -X stuff "free -g; uname -r"
Étape # 3: l' étape ci-dessus envoie uniquement le texte de la commande. Nous devons également envoyer un retour chariot à cette session d'écran détachée pour que le shell exécute notre commande. Le caractère ASCII 015 est un retour chariot sur la plupart des systèmes * nix.
$ screen -r chad -p0 -X eval "stuff \015"
Étape # 4: Redirigez la sortie de notre session d'écran détachée vers notre tty / pts actuel:
$ screen -r chad -p0 -X hardcopy $(tty)
La sortie de l'étape # 4 ressemblera à ceci:
$ 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
Bien que cela semble un peu impliqué, le processus est facilement scriptable. Avec python, je peux analyser la sortie de l'étape # 4 et capturer uniquement les données qui m'intéressent.
En choisissant un scénario simple comme récupérer les détails IP, j'ai écrit un exemple de script pour illustrer les concepts ci-dessus. N'hésitez pas à remplacer et à bricoler comme bon vous semble.
Exemple de script python pour obtenir les détails IP d'une session d'écran détachée:
#!/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 ci-dessus en action:
$ python screen-output-test.py
inet addr:192.168.1.201 Bcast:192.168.1.255 Mask:255.255.255.0
screen
? N'est-ce pas pour cela que les processus enfants sont faits?