screen — оставляем процессы в фоне и идем спать (пример файла .screenrc)

Screen Вспомнилась одна очень удобная и полезная программка для FreeBSD - screen называется. Screen - это полноценный консольный оконный менеджер, объединяющий физический терминал c (возможно) несколькими интерактивными, виртуальными шеллами, которые могут открепляться от физического терминала и продолжать "жить своей жизнью". Каждый виртуальный терминал предоставляет использование возможностей терминала DEC VT100 по стандартам ISO2022 (такие как вставка/удаление строки и поддержка различных кодировок). Также поддерживается сколлинг буфера для просмотра истории команд и механизм "копировать-вставить", что позволяет перемещать фрагменты текста между отдельными окнами.

Screen'ы удобны тем, что в них можно оставить любые запущенные процессы и уйти, закрыв физический терминал (если Вы ходите на сервер с помощью putty, например), а позднее, войдя в систему вновь, можно подключиться к висящему в фоне скрину и продолжить в нем работу. Скрины не раз выручали меня когда приходилось запускать на сервере процессы компиляции чего-либо надолго. Компьютер (рабочая станция) не может работать круглые сутки. К тому же, запуская что-то из дому, требуется потом проверить с работы как обстоят дела. Последний раз я вспомнил о screen, когда после обновления FreeBSD до 7.0 запускал обновление пакетов (--all). Процесс длился почти пару десятков часов, а сидеть возле монитора постоянно я, понятное дело, не мог... Да что там говорить. Это просто надо попробовать. В screen'е даже ту же самую аську можно запустить в фоне и свалить с машины. Рекомендую: Screen == Must Have!

Установить утилиту screen можно из портов FreeBSD. Компиляция + установка проста и занимает всего 30 секунд (сама программка довольно маленькая; пакет с исходниками весит всего 820 килобайт).

root# cd /usr/ports/
root# make search name="screen"
...
Port:   screen-4.0.3
Path:   /usr/ports/sysutils/screen
Info:   A multi-screen window manager
Maint:  cy@FreeBSD.org
B-deps:
R-deps:
WWW:    http://www.gnu.org/software/screen/
...
# cd /usr/ports/sysutils/screen
# make install clean

Осталось теперь совсем немного. Подогнать под себя файл настроек и... привыкнуть к необычным "быстрым клавишам". Их много, но на практике я использую совсем чуть-чуть.

Стандартный файл с настройками появится после установки в каталоге /usr/local/etc/. Называется он screenrc и его, для внесения изменений, лучше скопировать в домашний каталог пользователя.

root# cp /usr/local/etc/screenrc ~/.screenrc

Теперь отредактируем его. Вот мой вариант этого файла.

#################################################################
# Screen[rc] configuration file by Daemony
###
# --- Основное ---

# Отключаем приветственное сообщение
startup_message off

# Можно включить (или выключить - off)
# визуальный биппер.
vbell on
# И то, что он будет писать в строке статуса
vbell_msg "   Din!  -  Don!  "

# "Красивые" подписи
nethack on

# Сколько строчек истории хранить в буфере
defscrollback 2000
#
# Таймаут сообщений в секундах
msgwait 1

# --- Настройки строки состояния ---
#
# Строка состояния в screen или же по другому hardstatus
# определяется несколькими параметрами, идущими в одну строку.
#
hardstatus alwayslastline "%{=b}%{g} Term: %{b}%w %=%{kG}%C%A %D %Y-%m-%d"

# здесь (я беру параметры в одинарные кавычки):
# '%{=b}' - путем эксперимента удалось выяснить, что оно делает
# черным цвет фона строки. %)
# '%{g} Term: ' - задает вывести слово ' Term: ' зелеными
# буквами (пробелы тоже считаются - ими можно делать отступы)
# '%{b}%w' - выводит список запущенных оболочек голубым цветом
# '%=' - все, что идет после этого выравнивается по правому краю
# '%{kG}%C%A' - показывает время в двенадцатичасовом формате.
# '%D, %Y-%m-%d' - показывает дату: 'чт 2008-03-06'

# --- Привязки специальных клавиш ---

# - отделить сессию от текущего терминала
bindkey -k k7 detach

# - уничтожить текущую сессию
bindkey -k k8 kill

# - создать новое окно
bindkey -k k9 screen

# - переименовать текущее окно
bindkey -k k; title

# bind F11 вернуться к предыдущему окну
bindkey -k F1 prev

# bind F12 перейти к следущему окну.
bindkey -k F2 next

# --- Настройки для различных терминалов ---
# Взяты из дефолтового конфига /usr/local/etc/screenrc За пояснениями - в ман. ;) 

termcap  facit|vt100|xterm LP:G0
terminfo facit|vt100|xterm LP:G0
termcap  facit al=\E[L\E[K:AL@:dl@:DL@:cs=\E[%i%d;%dr:ic@
terminfo facit al=\E[L\E[K:AL@:dl@:DL@:cs=\E[%i%p1%d;%p2%dr:ic@
termcap  sun 'up=^K:AL=\E[%dL:DL=\E[%dM:UP=\E[%dA:DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:IC=\E[%d@:WS=1000\E[8;%d;%dt'
terminfo sun 'up=^K:AL=\E[%p1%dL:DL=\E[%p1%dM:UP=\E[%p1%dA:DO=\E[%p1%dB:LE=\E[%p1%dD:RI=\E[%p1%dC:IC=\E[%p1%d@:WS=\E[8;%p1%d;%p2%dt$<1000>'
termcap  xterm|fptwist hs@:cs=\E[%i%d;%dr:im=\E[4h:ei=\E[4l
terminfo xterm|fptwist hs@:cs=\E[%i%p1%d;%p2%dr:im=\E[4h:ei=\E[4l
termcap  vt100 dl=5\E[M
terminfo vt100 dl=5\E[M
termcap xterm 'is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l'
terminfo xterm 'is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l'
termcap  hp700 'Z0=\E[?3h:Z1=\E[?3l:hs:ts=\E[62"p\E[0$~\E[2$~\E[1$}:fs=\E[0}\E[61"p:ds=\E[62"p\E[1$~\E[61"p:ic@'
terminfo hp700 'Z0=\E[?3h:Z1=\E[?3l:hs:ts=\E[62"p\E[0$~\E[2$~\E[1$}:fs=\E[0}\E[61"p:ds=\E[62"p\E[1$~\E[61"p:ic@'
termcap wy75-42 nx:xo:Z0=\E[?3h\E[31h:Z1=\E[?3l\E[31h
terminfo wy75-42 nx:xo:Z0=\E[?3h\E[31h:Z1=\E[?3l\E[31h

# Удаляем некоторые ненужные или небезопасные комбинации
bind k
bind ^k
bind .
bind ^\
bind \\
bind ^h
bind h

# И еще пару строк, взятых с какого-то буржуйского сайта...
# - следущий показывает текущую активность
activity 'Activity on screen %n ^G'

# - а этим можно заменить строку hardstatus
caption always "%{+b bk}%H%{gk} | %c %{ck}%d.%m.%Y | %{gk} %?%-Lw%?%{gw}%n*%f %t%?(%u)%?%{gk}%?%+Lw%? | %{ck} Load: %l %{wk}"
#################################################################

Сохраняем этот файл и запускаем screen.

 daemony$ screen

Запустится терминал номер ноль. Теперь в Вашем распоряжении два режима. Сразу после входа в скрины будет доступен режим оболочки, в котором можно работать с консолью как и обычно. Для того, чтобы послать программе screen какую-либо команду следует нажать Crtl-A и сказать, например: Crtl-C - для создания новой оболочки; Ctrl и цифру с номером консоли (если запущено несколько виртуальных консолей) для перехода на эту консоль; Crtl-D - для того, чтобы открепиться от скрина и вернуться в физический терминал и так далее. Назначив в конфиге "быстрые клавиши", можно использовать и их. Это наиболее распространенные комбинации (что пришли в голову), а вот еще (те что в мане накопал):

  • Crtl и " - показать список активных окон и перейти к нужному;
  • Crtl-A дважды - перейти к предыдудщему окну;
  • Crtl-A a - послать окну эскейп последовательность Crtl-A;
  • Crtl-A A - переименовать текущее окно, задать свое название;
  • Crtl-A Crtl-B - послать в окно Break;
  • Crtl-A C - очистить текущее окно;
  • Crtl-A h - создать копию (что-то вроде ПринтСкрин) текущего окна в файл hardcopy.n, где n - номер текущего окна;
  • Crtl-A Crtl-I - показать информацию о текущем окне;
  • Crtl-A Crtl-K - уничтожить текущее окно;
  • Crtl-A Crtl-M - показать последнее сообщение в строке статуса;
  • Crtl-A Crtl-N - переключиться на следущее окно;
  • Crtl-A backspace или Crtl-A Crtl-P или Crtl-A p или Crtl-A h - переключиться на предыдущее окно;
  • Crtl-A S - разделить текущее окно на две части;
  • Crtl-A Crtl-X - блокировка текущего экрана под пароль пользователя, что ее запустил;
  • И самая полезная, на мой взгляд, комбинация - Crtl-A ? - она выведет справку по всем комбинациям клавиш. :cool:

Запускать можно сколько угодно скринов. Для того, чтобы вступить во взаимодействие со screen, висящему в фоне, следует набрать

 daemony$ screen -rd

Если запущено несколько скринов, то Вы увидите предупреждение:

daemony$ screen -rd
There are several suitable screens on:
        43929.ttyp6.hostname     (Detached)
        47381.ttyp5.hostname     (Detached)
        48024.ttyp5.hostname     (Detached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.

В этом случае следует указать идентификатор скрина - он кстати совпадает с id запущенного процесса screen в системе.

daemony$ screen -rd 43929

Естественно, обычные пользователи, не могут войти в чужой скрин. Ну, а root может все.

Screen'ы могут висеть в системе годами. До первой перезагрузки сервера. Если произошла перезагрузка и в этот момент висели активные скрины, то после ребута их, само собой, не останется. Но останутся их "трупы", о чем Вам сообщит программа:

daemony$ screen -rd
There are screens on:
        48273.ttyp5.hostname     (Dead ???)
        47381.ttyp5.hostname     (Dead ???)
        48024.ttyp5.hostname     (Dead ???)
Remove dead screens with 'screen -wipe'.
There is no screen to be detached.

Мол, простите, но нет открепленных скринов. Хотя есть убиенные с такими-то идентификаторами. Лежат они себе на "кладбище" в /tmp/screens/S-USERNAME и почистить их можно так:

daemony$ screen -wipe 48273 47381 48024
There is a screen on:
        48273.ttyp5.hostname     (Removed)
        47381.ttyp5.hostname     (Removed)
        48024.ttyp5.hostname     (Removed)
3 socket wiped out.
No Sockets found in /tmp/screens/S-daemony.

Вот такая полезная утилита. Пользуйтесь наздоровье! ;)

Понравился материал? Добавьте к себе в:

Тэги: , , , , , , ,

Об авторе Daemony

Это мой персональный Блог! Веду его с переменным успехом с 2007 года. Пишу здесь обо всем, что мне интересно. Среди моих интересов: системное администрирование *nix систем, компьютерные технологии, фотография и многое другое. Подробнее можно почитать на странице "О блоге". Связаться со мной можно через форму обратной связи на этом сайте. Спасибо, за то, что посетили My Live Blog!
Подпишитесь на новые комментарии к этой публикации.

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

  1. как быть если процесс уже запущен без nohup и на момент запуска screen не установлен ?

Поделиться мнением

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*
*

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Перед тем, как нажать кнопку "Отправить" введите проверочный код с изображения