Вопрос или проблема
Я запустил скрипт в сеансе screen, но забыл перенаправить stdout в файл. Там около 10 МБ текста. Если бы была возможность выделить текст и скопировать его, я бы это сделал, но Ctrl-A + Esc не позволяет прокручивать моё терминальное окно, когда я щёлкаю и перетаскиваю мышь. Я использую bash на Ubuntu 18. Есть ли что-нибудь, что я могу попробовать?
Обычно буфер обратной прокрутки не удерживает так много данных, так что у вас, скорее всего, проблемы. Извините.
Тем не менее, у screen есть свой собственный буфер обратной прокрутки, который отделён от вашего терминала (и, следовательно, кликов и перетаскиваний). Что вам нужно сделать:
- ctrl-a, а затем [ (левая квадратная скобка). Это войдёт в режим копирования screen (или как он там называется).
- Screen использует клавиши vi для перемещения курсора. Переместите курсор в конец вашего вывода.
- Нажмите пробел. Это начнёт выделение.
- Перемещайте курсор как можно дальше в историю (он будет прокручиваться по мере движения вверх).
- Нажмите пробел снова. Это завершит выделение и выйдет из режима копирования.
- Запустите cat > save_file.txt или что-то подобное.
- ctrl-a и ] (правая квадратная скобка).
- ctrl-d Конец файла. То, что было вставлено, будет в save_file.txt.
Если вы не знаете клавиши vi, пропустите #2 и выполняйте ctrl-b, пока он прокручивается для #4.
Если вы знаете заранее, можно запустить screen с аргументом -L, который создаст файл журнала для каждого окна в каталоге, из которого был запущен screen.
Из man страницы[1]
-L
сообщает screen включить автоматический журнал вывода для окон.
Ответ или решение
Вопрос, представленный перед нами, касается сохранения или захвата вывода экрана в файл после того, как информация была отправлена на стандартный вывод (stdout) в сессии Screen. Данная ситуация связана с ошибкой, когда пользователь запустил скрипт без изначального перенаправления вывода в файл, и теперь ему необходимо восстановить или сохранить 10 МБ текста, сгенерированного в этой сессии Bash на Ubuntu 18.
Теоретический аспект
В подавляющем большинстве терминалов стандартный метод сохранения вывода, уже отправленного в stdout, состоит в использовании перенаправления вывода с помощью операторов >
или >>
, когда командный вывод перенаправляется в файл для последующей обработки или анализа. Однако, если перенаправление не было заранее задано, мы сталкиваемся с необходимостью работать с буфером терминала или использовать возможности утилит, в данном случае — утилиты Screen.
Утилита GNU Screen предоставляет функционал изолированных сессий, что позволяет запускать командные процессы, которые продолжают выполнение даже после закрытия терминального окна. Screen имеет собственный буфер прокрутки, который хранит историю вывода независимо от буфера терминала, и это является ключом к решению нашей проблемы.
Пример использования функций Screen для решения проблемы
Чтобы воспользоваться возможностями Screen, следуйте следующим шагам:
-
Войти в режим копирования Screen: Нажмите
Ctrl-a
и затем[
. Это приведет к активации режима копирования, который аналогичен режиму редактирования в текстовом редакторе vi. -
Навигация по выводу: Используйте клавиши управления курсором, аналогичные управлению в vi, чтобы переместиться к концу вашего вывода. В случае, если ви-подобные клавиши вам неизвестны, можно использовать
Ctrl-b
, чтобы листать в истории вывода. -
Начало выделения: Нажмите
пробел
для начала выделения текста. -
Процесс выделения: Продолжайте двигаться вверх по истории вывода, чтобы выделить весь необходимый текст.
-
Завершение выделения: Когда вы достигнете начала вывода или нужное количество текста будет выделено, снова нажмите
пробел
. Это завершит выделение и выйдет из режима копирования. -
Создание файла и настройка для вставки: Выполните команду
cat > save_file.txt
для создания файла, в который будет помещен текст. -
Вставка в файл: Нажмите
Ctrl-a
и затем]
, чтобы вставить ранее скопированный текст в ваш файлsave_file.txt
. -
Окончание вставки: Используйте
Ctrl-d
, чтобы завершить ввод, что приведет к сохранению содержимого в файл.
Применение практических советов
В будущем, для избежания подобных ситуаций, когда необходимо будет заранее сохранять весь вывод, рекомендуется запускать Screen с параметром -L
. Данный параметр активирует автоматическую запись вывода всех окон в лог-файлы, созданные в директории, откуда была запущена сессия Screen.
Таким образом, автоматически ведётся запись всех взаимодействий с терминалом, удерживаясь в файлах, которые можно анализировать или архивировать. Использование этого подхода будет полезно в случаях, когда вас может установить опасающийся потерять важное диагностическое или аналитическое сообщение. Это также наглядно демонстрирует важность планирования при работе в сложных командных средах.
В завершение, знание и использование функционала системных утилит, таких как Screen, существенно расширяет возможности управления системными процессами и помогает в результате избегать проблем, связанных с безвозвратной потерей данных.