Содержание
Есть такая замечательная утилита screen, о которой я раньше вообще не знал! Теперь же стараюсь постоянно использовать. И, надеюсь, после прочтения этой статьи, будете использовать её и вы.
Итак, для чего она нужна?
Уж сколько раз была ситуация, когда, работая в терминале по SSH получал дисконнект и все наработки (открытый конфиг или процесс копирования) терялись. Screen позволяет запускать в своём окружении сеансы пользователя и получать к ним доступ, имея как бы разные виртуальные консоли. Можно оставить открытым конфиг какого-либо сервиса, отключиться под конец рабочего дня, приехать домой и подключиться к этому же сеансу из дома и всё, что было в терминале будет вам доступно, включая историю, открытый редактор и т.д. Разрывы связи теперь не помеха. Можно иметь несколько разных сеансов и подключаться к ним произвольно!
Посмотрим, как это работает:
Утилита у меня была уже установлена, о чём радостно сообщила мне команда:
# dpkg info | grep screen
Ну вот и всё! Теперь можно начинать работу.
Работа с сессиями Screen
Запускать screen можно набрав в консоли название этой программы. Вы сразу попадете либо в терминал, либо на окно приглашения, откуда после нажатия пробела или ввода опять же в терминал.
Посмотреть все сессии screen-а можно так:
# screen -ls
Если сессии открыты, то подключиться к ним можно так:
# screen -x Имя
либо без имени, если сессия одна.
Создать сессию с определенным именем можно так:
# screen -S "name"
Кроме того, можно сразу запускать программы в Screen-сессию, набирая их:
# screen <команда>
Поработали мы со скрином, теперь можем либо убить сессию (выйдя из оболочки), либо отключиться от неё (Ctrl+D). При этом всё, что было в сессии продолжит выполняться и дальше.
Кроме того в одном окне screen можно использовать несколько консолей.
Убить сессию можно командой [Ctrl+a] и затем k.
Управление Screen-ом
У screen-а весьма специфичное управление. Программе, запущенной внутри него передаются все нажатия клавиш, кроме тех, что предваряются сочетанием Ctrl+a (по умолчанию). Т.е. чтобы управлять screen-ом – нужно сперва нажать эту комбинацию, а затем набрать управляющую клавишу.
Итак, создаём новое окно внутри сессии screen:
# [Ctrl+a] c
Можем переименовать это окно, для того, чтобы иметь возможность быстро его найти:
# [Ctrl+a] A
Набрали текст, жмём Enter.
Просмотреть все окна можно так:
# [Ctrl+a] “
Выведет нам интерактивный список окон с номерами и именами, можно переключиться на любое.
Есть варианты выбрать не интерактивный список [Ctrl+a] w, а так же переключаться на следующее [Ctrl+a] n или на предыдущее окно [Ctrl+a] p. Либо сразу на заранее известный номер окна [Ctrl+a] 2. Обратите внимание, что нумерация ведется с нуля.
Это может быть очень удобно вот для чего: допустим, нам нужно в реально времени мониторить какой-либо процесс. Предположим, нужно слушать log-файл постоянно. Для этого нам нужна команда
# tail -f /path/to/log
которая будет в реальном времени забирать 10 последних записей и выводить их на экран. Создадим новую консоль screen так:
# screen -d -m -S tail-log tail -f /var/log/nginx/error.log
– это создаст новую сессию screen-а, т.е. когда скрины пока не запущены вообще. При наборе этой команды, на первый взгляд, ничего не происходит. На самом деле так и есть. Создаётся (-m) новый сеанс по имени “tail-log
“, в котором выполняется команда “tail -f /var/log/nginx/error.log
” (выводящая 10 последних записей лог-файла в реальном времени), и этот сеанс запускается уже свёрнутым (-d).
Если же скрин у вас уже запущен, то можно создать новое окно:
# [Ctrl+a] c
Переименовать его в tail-log
# [Ctrl+a] A
…
И запустить там нужную нам команду:
# tail -f /var/log/nginx/error.log
А в другом окне, аналогичным образом, открыть редактор правил файрволла и добавлять в DENY тех, кто нам явно нежелателен Ну или иное другое подобное применение, когда нужно быстро переключаться из окна в окно.
Мониторинг изменений окна
Но и это ещё не всё. Удобства ещё только начинаются. Есть ситуации, когда вывод какого-либо окна долго остается неизменным. Например ждать, пока в логи попадёт какая-либо информация может быть очень долго. И screen кое-что имеет на этот счёт!
Запустили мы два окна LOG в котором прослушивается лог-файл, и USER в котором наша консоль. Ждём пока в консоли. Реагировать будем тогда, когда в прослушиваемый LOG что-то придёт. Но не переключаться же постоянно туда-сюда, с целью уловить изменения?
Нажимаем сочетание:
# [Ctrl+a] M
и включаем мониторинг активности окна. Теперь если текст окна изменится, то в списке окон возле его имени будет отображен символ “@”, а внизу окна на несколько секунд появится надпись “Активность в окне №…”!
Так же есть обратная возможность мониторить “тишину”, для этого используется команда: [Ctrl+a] _.
Два окна сразу
А можно ли открыть два консольных окна сразу? Конечно можно! Screen позволяет разделить окно. Вот как мы это сделаем.
Разделяем окно на части:
# [Ctrl+a] S
При этом текущее окно пойдёт в верхнюю часть.
Переключение на нижестоящий регион (на первый, если уже на самом нижнем) осуществляется так:
# [Ctrl+a] Tab
Открываем там другую консоль:
# [Ctrl+a] “
и выбираем её по имени. Имена окон подсвечиваются (0 LOG, 1 USER) чтобы мы не заплутали между ними.
Перемещая фокус ввода по Tab-у, как описано выше, мы, наконец, наигрались. Закрываем окна.
# [Ctrl+a] X – закрывает текущий регион, [Ctrl+a] Q закрывает все другие, кроме текущего. Смотря что вам нужно.
Копирование текста между окнами
Есть ещё одна интересная возможность – копирование текста между окнами через особый буфер.
Для этого есть команда
# [Ctrl+a] [ , при этом можно перемещаться по окну курсорными клавишами, для определения начала текстового фрагмента жмём пробел. Двигая стрелочками курсор, отмечаем конец выделения и снова жмём пробел. Всё, фрагмент скопирован. Вставляется он в это же или другое окно нажатием [Ctrl+a] ]. Всё просто!
Ведение лога и принт-скрин
Так же можно вести трассировку всего текста, выдаваемого в окно в особый файл screenlog.<N> где N – номер окна.
# [Ctrl+a] H
Теперь все результаты вашей работы будут логироваться и можно посмотреть историю не только ввода, но и вывода.
Так же команда для снятия текущего окна
# [Ctrl+a] h
передает в файл hardcopy.<N> только содержимое текущего окна, а не мониторит ввод-вывод постоянно. Аналог принт-скрина.
Конфигурирование
Для себя можно сконфигурировать Screen весьма гибко. После запуска выполняются команды в конфигах /etc/screenrc и персональные .screenrc в каталоге пользователя.
У каждой клавиатурной команды есть и текстовый вариант для конфига, который можно посмотреть в справке.
Но для примера вот такой конфиг, в котором отключаем приветствие, создаем заголовок и строку статуса, создаем два окна USER и LOG, в которых открываем соответствующие каталоги, делаем активным первое окно USER.
startup_message off
caption always "%{= 45}%{+b w}Screen: %n | %h %=%t %c"
hardstatus alwayslastline "%-Lw%{= BW}%50>%n%f* %t%{-}%+Lw%<"
chdir /root/
screen -t USER
chdir /var/log/nginx/
screen -t LOG
select 0
Теперь при простом запуске скрина у нас будет следующее:
Справка
Есть и другие возможности, которые можно посмотреть так:
# [Ctrl+a] ?
Comments: