[home] [software] [knowledge base] [manpages] [code] [markdown] [my ip]

Терминальные мультиплексоры

Терминальный мультиплексор — это утилита, которая позволяет запускать несколько сессий оболочки в рамках одной сессии и также отсоединять собственную сессию от оболочки.

Для пояснения зачем это нужно я процитирую русскую Википедию:

Это полезно для работы с несколькими программами из командной строки, а также для запуска программ на удаленном сервере.

Возможно звучит сложно, но всё проще чем кажется. В этой заметке я попробую наглядно объяснить концепцию и приёмы работы с мультиплексорами терминала.

Сейчас распространено два мультиплексора терминала:

Как набирать комбинации клавиш

Вначале набрается модификатор, например Ctrl+a, затем надо отпустить клавиши и нажать на клавишу команды, например ?.

Пример использования

Итак, я подключаюсь к серверу по SSH с целью запустить там какую-то команду. После запуска команды я намерен отключиться от сервера. При этом команда должна продолжить выполняться. Я также должен увидеть результат её выполнения, когда вновь подключусь к серверу.

1. Подключаюсь по SSH:

localhost           server
+------------+      +------------------+
| ssh_client |----->| ssh_session      |
+------------+      +------------------+
(you are here)----->| shell_session(0) |
                    +------------------+

После успешного подключения по SSH я окажусь в сессии оболочки — (0). При этом если оборвётся SSH-сессия, то я потеряю всё что в ней было.

2. Как только я запущу screen картинка примет следующий вид:

localhost           server
+------------+      +------------------+
| ssh_client |----->| ssh_session      |
+------------+      +------------------+
                    | shell_session(0) |
                    +------------------+
                    | screen_session   |
                    +------------------+
(you are here)----->| shell_session(1) |
                    +------------------+

3. Для примера запущу vim:

localhost           server
+------------+      +------------------+
| ssh_client |----->| ssh_session      |
+------------+      +------------------+
                    | shell_session(0) |
                    +------------------+
                    | screen_session   |
                    +------------------+
(you are here)----->| shell_session(1) |
                    +------------------+
                    | vim              |
                    +------------------+

4. Теперь я отключусь (detach) от сессии screen:

localhost           server
+------------+      +------------------+ +------------------+
| ssh_client |----->| ssh_session      | | screen_session   |
+------------+      +------------------+ +------------------+
(you are here)----->| shell_session(0) | | shell_session(1) |
                    +------------------+ +------------------+
                                         | vim              |
                                         +------------------+

Сессия screen отсоединилась от оболочки (0). При этом оболочка (1) продолжает работать. Сейчас можно отключиться от SSH.

Когда я подключусь к серверу вновь, то окажусть в ситуации как на схеме 4, но после выполнения команды screen -r всё вернётся к состоянию как на схеме 3 и я смогу продолжить работу в vim.

screen

screen просто работает. Он минималистичен и прост в использовании.

Запуск новой сессии:

screen [-S имя_сессии]

Подключиться к запущенной сессии:

screen -r [имя_сессии]

Комбинация

Действие

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

Отсоединиться от текущей сессии

При разделении экрана на области появится новая пустая область. Нужно переключить на неё фокус и запустить новое окно с оболочкой Ctrl+a c.

Конфигурация screen хранится в файле ~/.screenrc. Я для себя написал совсем простой конфиг, который тем не менее показывает всё что действительно нужно.

startup_message off
hardstatus alwayslastline
hardstatus string '%S: %-w%>(%n %t)%{-}%+w%<'
Terminal with screen

Материалы по screen:

tmux

tmux — это более новороченное решение. Он умеет почти всё то же что screen + имеет дополнительные фичи вроде управления мышью.

Запустить новую сессию:

tmux [new -s имя_сессии]

Подключиться к сессии:

tmux a [-t имя_сессии]

Комбинация

Действие

Ctrl+b c

Создать новое окно

Ctrl+b ,

Переименовать окно

Ctrl+b w

Список окон

Ctrl+b "

Разделить текущую область по горизотали

ctrl+b %

Разделить текущую область по вертикали

Ctrl+b x

Закрыть текущую панель

Ctrl+b [

Перейти в режим копирования текста + скроллинг

Ctrl+b d

Отсоединиться от сессии

Мой ~/.tmux.conf:

set -g mouse on
set -g history-limit 5000

# vim style controls
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

bind -r H resize-pane -L 10
bind -r J resize-pane -D 10
bind -r K resize-pane -U 10
bind -r L resize-pane -R 10

# Copy / paste
bind b list-buffers
bind B show-buffer
bind P paste-buffer

bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi y send-keys -X copy-selection
bind-key -T copy-mode-vi r send-keys -X rectangle-toggle

bind -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel \
    "xclip -i -f -selection primary | xclip -i -selection clipboard"

Ссылки: