У мене є сценарій python, який відслідковує численні окремі сеанси екрану та фіксує вихід з кожного (коли команди використання, такі як free, top -bn2, iostat періодично надсилаються через 'stuff').
Замість того, щоб перенаправляти на файл і, таким чином, керувати принаймні одним файлом на окремому сеансі екрана ... Я просто переспрямовую на будь-який tty / pts, який використовує мій батьківський сеанс.
Крок №1: Почніть новий сеанс на екрані (з людським читальним іменем) у відірваному режимі.
$ screen -dmS chad
Крок №2: Надішліть свої команди (я буду використовувати команду 'free -g' разом із 'uname -r') через речі. Важливо вказати вікно, яке ви хочете використовувати (в нашому випадку перше і єдине вікно) за допомогою -p.
$ screen -r chad -p0 -X stuff "free -g; uname -r"
Крок №3: Наведений вище крок лише надсилає текст команди. Нам також потрібно надіслати повернення каретки до цього сеансу окремого екрана, щоб оболонка виконувала нашу команду. Символ 015 ASCII - це повернення каретки для більшості * nix систем.
$ screen -r chad -p0 -X eval "stuff \015"
Крок №4: Перенаправляємо вихід нашого сеансу окремого екрана на поточний tty / pts:
$ screen -r chad -p0 -X hardcopy $(tty)
Висновок кроку №4 буде виглядати приблизно так:
$ 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
Хоча це здається дещо задіяним, процес легко прописаний. За допомогою python я можу проаналізувати результат кроку №4 та захопити лише ті дані, які мене цікавлять.
Вибираючи простий сценарій, як захоплення деталей IP-адреси, я написав приклад сценарію, щоб продемонструвати вищезгадані концепції. Не соромтеся замінювати та балакати, як вважаєте за потрібне.
Приклад сценарію python для отримання деталей IP-адреси з сеансу окремого екрана:
#!/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()
Вище написаний сценарій:
$ python screen-output-test.py
inet addr:192.168.1.201 Bcast:192.168.1.255 Mask:255.255.255.0
screen
? Чи не для цього створені дитячі процеси?