У меня есть скрипт на 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: Приведенный выше шаг только отправляет текст команды. Нам также необходимо отправить возврат каретки в этот отдельный сеанс экрана, чтобы оболочка выполнила нашу команду. Символ ASCII 015 - это возврат каретки в большинстве систем * 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
? Разве не для этого созданы дочерние процессы?