GNU Screen (Русский) - ArchWiki

Jump to content
From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи GNU Screen. Дата последней синхронизации: 15 января 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Ссылки по теме

- tmux
- Ratpoison
- Xpra

GNU Screen — это полноэкранный оконный менеджер для терминала, который мультиплексирует его между несколькими процессами, обычно интерактивными оболочками. Программы, запущенные в Screen, продолжают работать, когда их окно в данный момент скрыто, и даже когда весь сеанс screen отсоединён от пользовательского терминала.

Обзор возможностей можно почитать в документации GNU Screen.

## Установка

Установите пакет screen.

## Использование

Для ввода команд нужно нажать escape-комбинацию (по умолчанию `Ctrl+a`) и затем нужное сочетание клавиш.

Некоторым пользователям `Ctrl+a` кажется неудобным. Можно назначить другое сочетание клавиш, как описано в разделе #Изменение escape-комбинации.

### Стандартные команды

- `ctrl+a` `?` Отображает список команд и их параметры по умолчанию
- `ctrl+a` `:` Ввод команды для screen
- `ctrl+a` `"` Список окон
- `ctrl+a` `0` Открыть окно 0
- `ctrl+a` `A` Переименовать текущее окно
- `ctrl+a` `a` Отправить `ctrl+a` в текущее окно
- `ctrl+a` `c` Создать новое окно
- `ctrl+a` `S` Разделить текущий регион на два по горизонтали
- `Ctrl+a` `|` Разделить текущий регион на два по вертикали
- `ctrl+a` `tab` Переключить фокус ввода на следующий регион
- `ctrl+a` `ctrl+a` Переключение между текущим и предыдущим регионами
- `ctrl+a` `Esc` Перейти в режим копирования (используйте enter для выделения текста)
- `ctrl+a` `]` Вставка текста
- `ctrl+a` `Q` Закрыть все регионы кроме текущего
- `ctrl+a` `X` Закрыть текущий регион
- `ctrl+a` `d` Отключиться от текущего сеанса screen, оставив его работающим в фоне. Для переподключения используйте `screen -r`

### Вводимые команды

- `Ctrl+a` `:quit` Закрывает все окна и завершает сеанс screen
- `Ctrl+a` `:source ~/.screenrc` Перезагружает файл настроек screenrc (также можно использовать `/etc/screenrc`)

### Именованные сеансы

Создание сеанса с определённым названием:

    $ screen -S название_сеанса

Переименование текущего сеанса:

`Ctrl+a` `:sessionname название_сеанса`

Список всех существующих сеансов текущего пользователя:

    $ screen -list

Подключение к существующему сеансу по его имени:

    $ screen -x название_сеанса

или

    $ screen -r название_сеанса

### Настройка Screen

Вы можете изменить настройки Screen по умолчанию в соответствии с вашими предпочтениями в файле `.screenrc`, который содержит команды, которые выполнятся при запуске (например, `~/.screenrc` или на лету с помощью ввода команд (например, `Ctrl+a` `:vbell off`).

## Советы и рекомендации

### Автозапуск с помощью systemd

Эта служба автоматически запускает screen для указанного пользователя (например, `systemctl enable screen@florian`). Важно запускать эту службу как системную, так как systemd --user может не запуститься, а также будет завершён после закрытия последнего сеанса пользователя.

    /etc/systemd/system/screen@.service

    [Unit]
    Description=screen
    After=network.target

    [Service]
    Type=simple
    User=%i
    ExecStart=/usr/bin/screen -DmS autoscreen
    ExecStop=/usr/bin/screen -S autoscreen -X quit

    [Install]
    WantedBy=multi-user.target

### Изменение escape-комбинации

Изменение стандартной escape-комбинации может быть хорошей идеей не только потому, что «a» обычно набирается левым мизинцем, но также и потому, что `Ctrl+a` часто используется как команда `beginning-of-line` в GNU Readline и bash-совместимых командных оболочках.

Её можно изменить с помощью опции `escape` в `~/.screenrc` или параметра `-e` для команды `screen`.

Например, если вы заметите, что редко используете `Ctrl+j` в своей оболочке или редакторе, вы можете использовать `escape ^Jj` для изменения escape-последовательности на `Ctrl+j`. Второй "j" означает, что литерал `Ctrl+j` может быть отправлен на терминал путём нажатия `Ctrl+j` `j`. Для пользователей Dvorak более удобным может быть сочетание клавиш `Ctrl+t` (`escape ^Tt`).

Более экзотические варианты: `escape ```, который задаёт клавишу ```, или `escape ^^^`, который задаёт `Ctrl+^`.

Escape-комбинация также называется "командным символом" ("command character") в документации Screen.

### Запуск в окне 1

По умолчанию, первое окно screen имеет номер 0. Возможно, вы предпочтете начать с нумерацию с единицы, добавьте это в ~/.screenrc:

    ~/.screenrc

    bind c screen 1
    bind ^c screen 1
    bind 0 select 10
    screen 1

### Вложенные сеансы Screen

Можно случайно застрять во вложенном сеансе screen. Частый сценарий: вы запускаете сеанс SSH внутри сеанса screen. В сеансе SSH вы запускаете screen. По умолчанию первый сеанс screen будет перехватывать команды `Ctrl+a`. Чтобы отправить команду второму сеансу screen, используйте `Ctrl+a` `a` и затем свою команду. Например:

- `Ctrl+a` `a` `d` Отсоединяется от внутреннего сеанса screen.
- `Ctrl+a` `a` `K` Завершает (kill) внутренний сеанс screen.

### Запуск Screen во всех командных оболочках

Для Bash и Zsh добавьте следующий фрагмент в ваш `.bashrc` or `.zshrc` перед псевдонимами:

    ~/.bashrc or ~/.zshrc

    if [[ -z "$STY" ]]; then
       screen -xRR название_сеанса
    fi

### Использование 256 цветов

По умолчанию Screen использует эмулятор 8-цветного терминала. Чтобы включить больше цветов, вам нужно использовать терминал, который их поддерживает, и установить правильное значение term. Будет использоваться terminfo для описания того, как будут интерпретироваться управляющие коды ANSI. Запись в структуре базы данных terminfo должна существовать, ncurses предоставляет много описаний в `/usr/share/terminfo/`.

Сначала попробуйте общее значение:

    ~/.screenrc

    term screen-256color

Если это не работает, попробуйте установить значение, соответствующее вашему текущему терминалу. Например, при использовании терминала на основе xterm:

    ~/.screenrc

    term xterm-256color

Для rxvt-unicode:

    ~/.screenrc

    term rxvt-unicode-256color

Примечание: Файл `/usr/share/terminfo/r/rxvt-unicode-256color` предоставляется пакетом rxvt-unicode-terminfo, который устанавливается как зависимость пакета rxvt-unicode. Однако, если вы подключаетесь к серверу по SSH и на нём запускаете screen, нужный файл terminfo может не найтись на сервере. В таком случае можно скопировать `/usr/share/terminfo/r/rxvt-unicode-256color` на сервер в каталог `~/.terminfo/`.

В крайнем случае попробуйте использовать termcapinfo:

    ~/.screenrc

    attrcolor b ".I"    # allow bold colors - necessary for some reason
    termcapinfo xterm 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm'   # tell screen how to set colors. AB = background, AF=foreground
    defbce on    # use current bg color for erased chars

### Информативный статус-бар

Стандартный статус бар немного пустоват. Вы можете посчитать это полезным:

    ~/.screenrc

    hardstatus off
    hardstatus alwayslastline
    hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %m-%d %{W} %c %{g}]'

Ещё вариант из frodfrog's blog[устаревшая ссылка 2023-04-23 ⓘ]:

    ~/.screenrc

    hardstatus alwayslastline '%{= G}[ %{G}%H %{g}][%= %{= w}%?%-Lw%?%{= R}%n*%f %t%?%{= R}(%u)%?%{= w}%+Lw%?%= %{= g}][ %{y}Load: %l %{g}][%{B}%Y-%m-%d %{W}%c:%s %{g}]'

В Screen версии 5 (master-ветка) escape-коды изменились:

    ~/.screenrc

    truecolors on
    hardstatus off
    backtick 0 5 5 "/bin/date" '+%Y-%m-%d'
    backtick 1 5 5 "/bin/date" '+%H:%M'
    hardstatus alwayslastline '%{#00ff00}[ %H ][%{#ffffff}%= %{7}%?%-Lw%?%{1;0}%{1}(%{15}%n%f%t%?(%u)%?%{1;0}%{1})%{7}%?%+Lw%?%? %=%{#00ff00}][ %{#00a5ff}%{6}%0` %{#ffffff}%{7}%1`%{#00ff00} ]'

Статус-бар наверху:

    ~/.screenrc

    hardstatus firstline

### Отключение приветственного сообщения

    ~/.screenrc

    startup_message off

### Использование hardstatus в качестве динамического заголовка окна терминала

Это довольно просто: переделайте текущий `hardstatus` на `caption` с уведомлением и отредактируйте соответствующим образом:

    ~/.screenrc

    backtick 1 5 5 true
    termcapinfo rxvt* 'hs:ts=\E]2;:fs=\007:ds=\E]2;\007'
    hardstatus string "screen (%n: %t)"
    caption string "%{= kw}%Y-%m-%d;%c %{= kw}%-Lw%{= kG}%{+b}[%n %t]%{-b}%{= kw}%+Lw%1`"
    caption always

Это отобразит что-то вроде `screen (0 bash)` в заголовке окна вашего терминала. Caption содержит дату, текущее время и раскрашивает коллекцию экранных окон.

### Использование механизма прокрутки X

Доступ к буферу прокрутки GNU Screen можно получить с помощью `Ctrl+a` `[`. Однако это очень неудобно. Чтобы использовать полосу прокрутки эмулятора терминала (например, в xterm или Konsole), добавьте следующую строку [1]:

    ~/.screenrc

    termcapinfo xterm*|rxvt*|kterm*|Eterm* ti@:te@

### Перемещение работающий программы в Screen

Если вы запустили программу вне Screen, но теперь хотите поместить её внутрь Screen, вы можете использовать reptyr, чтобы переназначить процесс с его текущего TTY на Screen.

Установите пакет reptyr.

Найдите PID нужного процесса (например с помощью `ps ax`) и используйте его как аргумент для команды reptyr внутри нужного окна screen:

    $ reptyr pid

### Использование другой строки приглашения bash внутри screen

Добавьте в `.bashrc`[2]:

    if [ -z $STY ]
    then
            PS1="ОБЫЧНЫЙ PROMPT"
    else
            PS1="PROMPT ДЛЯ SCREEN"
    fi

### Отключение визуального сигнала

По умолчанию при получении ASCII-символа Bell Screen некрасиво мерцает. Можно отключить это и вернуть звуковой сигнал с помощью этой опции:

    ~/.screenrc

    vbell off

### Избавление от вертикальных и горизонтальных полос

Чтобы скрыть вертикальные полосы:

    $ ~/.screenrc

    rendition so =00

Чтобы скрыть горизонтальные полосы, установите в `caption` основной и фоновый цвета в default (d) и выведите пустоту (" "):

    ~/.screenrc

    caption string "%{03} "

Если это не сработает, попробуйте `caption string "%{00} "`. Для стандартного чёрно-белого caption используйте `caption string "%{00}%3n %t"`.

## Решение проблем

### Исправление остатков текста после редактора

После открытия и последующего закрытия текстового редактора внутри screen (например nano) текст может оставаться видимым в терминале. Исправление:

    ~/.screenrc

    altscreen on

### Исправление столбца Name в windowlist, который отображает только "bash"

Добавьте в `~/.screenrc`:

    ~/.screenrc

    windowlist string "%4n %h%=%f"

## Смотрите также

- Wikipedia:GNU Screen
- GNU Screen User's Manual
- Gentoo:Screen
- Arch Forums - коллекция настроек .screenrc со скриншотами
- Arch Forums - Про проблему с 256 цветами в urxvt
- MacOSX Hints - Automatically using screen in your shell[устаревшая ссылка 2023-06-17 ⓘ]

Categories:

- Terminal multiplexers (Русский)
- GNU (Русский)

Hidden category:

- Pages with dead links