воскресенье, 17 января 2010 г.

Запись и воспроизведение интерактивных shell-сессий

При работе в UNIX-среде часто возникает необходимость сохранить содержимое текущей shell-сессии для дальнейшего использования. К примеру, можно сохранить последовательность shell-команд в файл чтобы лихорадочно не вспоминать её когда она потребуется вновь. Этот файл может также послужить наброском для будущей статьи или какой-нибудь инструкции.

Самый очевидный способ - копирование всего ввода и вывода через буфер обмена. Хотя этот вариант и прост, он не особо удобен если данных очень много (чаще всего вывода). Отличная альтернатива - утилита script(1). Она запускает новую shell-сессию, весь ввод и вывод которой сохраняется в указанном файле (по умолчанию в текущей директории создаётся файл typescript):
script session.log
У программы script есть одна любопытная опция - -t Если она указана, то script выводит на STDERR временную информацию, иначе говоря, реальную скорость набора команд и получения их вывода. Имя под рукой содержимое shell-сессии и этот временной файл, сохранённую shell-сессию возможно "воспроизвести" подобно видеоролику (только консольному). Вот как это выглядит запись:
script session.log -t 2> session.time
А вот так можно воспроизвести сохранённый ролик (именно воспроизвести - сами команды, разумеется, заново не выполняются):
scriptreplay session.time session.log
Стоит отметить, что интерактивные программы, такие как top или mc также записываются и воспроизводятся без проблем. Однако есть один нюанс. Дело в том, что плеер не имеет понятия о том какого размера должно быть окно во время воспроизведения. Так, если сессия была записана на компьютере с 21-дюймовым монитором, причём окно псевдо-терминала было раскрыто на весь экран, то при воспроизведении на 19-м мониторе вывод таких интерактивных программ как top или mc исказится. То же произойдёт если во время записи менять размер окна псевдо-терминала. Другими словами, автоматически картинка не масштабируется.

В целом, запись и последующее воспроизведение shell-сессий вещь достаточно интересная, но область её применения довольно ограничена. Приведу одно из наиболее полезных применений для этой функции. Предположим вы хотите рассказать коллеге как выполнить ту или иную задачу. Объяснять это на словах не эффективно, а специально для этого писать статью - слишком долго. Как вариант, можно записать свой "мастер-класс" в виде консольного видеоролика и отдать его коллеге или коллегам для ознакомления.

В любом случае, даже если воспроизведение сессий не требуется, статическая запись всего ввода и вывода shell-сессий имеет массу полезных применений. Стоит отметить, что подобной функцией обладает и программа screen(1). Соответствующая команда называется C-a H.

Для записи и воспроизведения консольных роликов можно также попробовать пару программ ttyrec и ttyplay соответственно:
ttyrec tty.log
ttyplay tty.log
Программа ttyrec специально предназначена для записи интерактивных сессий. Временная информация и данные при этом сохраняются в одном файле.

Ссылки

Комментариев нет:

Отправить комментарий