Материал просмотрен 2,353 раз(а)

Есть такая замечательная утилита 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) чтобы мы не заплутали между ними.

2 окна

2 окна сразу? Легко

Перемещая фокус ввода по 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] ?