Tmux: продуктивная работа с терминалом
Если вы работаете с серверами по SSH, рано или поздно случается: обрыв соединения посреди длительного процесса, и всё пропало. Или нужно следить за логами в одном окне, редактировать конфиг в другом, а в третьем запускать деплой. Переключаться между терминалами — неудобно, открывать пять SSH-сессий к одному серверу — расточительно.
Tmux решает обе проблемы: он сохраняет сессии при разрыве соединения и позволяет работать с несколькими панелями в одном терминале. После недели использования вы не захотите возвращаться к голому терминалу.
Установка
На большинстве дистрибутивов tmux есть в стандартных репозиториях:
# Ubuntu/Debian
sudo apt install -y tmux
# CentOS/RHEL
sudo yum install -y tmux
# macOS
brew install tmux
# Проверяем версию
tmux -V Рекомендую tmux 3.0+ — в нём появились важные улучшения: поддержка popup-окон, улучшенная работа с буфером обмена, настраиваемые хуки.
Базовые концепции
Tmux оперирует тремя уровнями абстракции:
Сессия (session) — верхний уровень. Это именованная группа окон. Сессия живёт на сервере, даже если вы отключились. Можно иметь несколько сессий: одна для проекта A, другая для проекта B.
Окно (window) — аналог вкладки в браузере. Каждое окно занимает весь экран терминала. Переключение между окнами мгновенное.
Панель (pane) — разделение окна на области. Можно разбить окно вертикально, горизонтально или комбинированно. Каждая панель — независимый терминал.
Все команды tmux начинаются с префикса — по умолчанию Ctrl+b. Нажимаете Ctrl+b, отпускаете, затем нажимаете клавишу команды.
Работа с сессиями
# Создать новую сессию с именем
tmux new-session -s work
# Или сокращённо
tmux new -s work
# Отключиться от сессии (detach) — сессия продолжает работать
# Ctrl+b, затем d
# Список активных сессий
tmux list-sessions
# или сокращённо
tmux ls
# Подключиться к существующей сессии
tmux attach -t work
# или
tmux a -t work
# Подключиться к последней сессии
tmux a
# Убить сессию
tmux kill-session -t work
# Переименовать текущую сессию
# Ctrl+b, затем $ Типичный workflow: подключаетесь к серверу по SSH, создаёте tmux-сессию, работаете. Если SSH-соединение обрывается — сессия остаётся. Переподключаетесь и делаете tmux a — всё на месте, все процессы работают.
Работа с окнами
# Создать новое окно
# Ctrl+b, затем c
# Переключиться на следующее окно
# Ctrl+b, затем n
# Переключиться на предыдущее окно
# Ctrl+b, затем p
# Переключиться на окно по номеру
# Ctrl+b, затем 0..9
# Переименовать текущее окно
# Ctrl+b, затем ,
# Закрыть текущее окно
# Ctrl+b, затем &
# или просто exit в шелле В строке состояния внизу видны все окна с их номерами и именами. Звёздочка * отмечает текущее окно.
Работа с панелями
Панели — это основная причина, по которой люди начинают использовать tmux:
# Разделить горизонтально (верх/низ)
# Ctrl+b, затем "
# Разделить вертикально (лево/право)
# Ctrl+b, затем %
# Переключиться между панелями
# Ctrl+b, затем стрелки (←↑↓→)
# Изменить размер панели
# Ctrl+b, зажать стрелку
# Перевести панель в полноэкранный режим (zoom)
# Ctrl+b, затем z
# Повторное нажатие — вернуть обратно
# Закрыть текущую панель
# Ctrl+b, затем x
# Поменять панели местами
# Ctrl+b, затем { или }
# Выбрать раскладку панелей
# Ctrl+b, затем пробел (переключает стандартные раскладки) Zoom-режим (Ctrl+b z) особенно полезен: развернули панель с логами на весь экран, посмотрели, нажали z снова — вернулись к многопанельному виду.
Копирование текста (copy mode)
Tmux имеет собственный буфер для копирования. Это работает даже через SSH — не нужно выделять мышью:
# Войти в режим копирования
# Ctrl+b, затем [
# Навигация — стрелки или vi-клавиши (hjkl)
# Начать выделение — пробел
# Скопировать выделенное — Enter
# Вставить из буфера tmux
# Ctrl+b, затем ] Для полноценной работы в copy mode лучше включить vi-клавиши (см. раздел про конфиг ниже).
Конфигурация: ~/.tmux.conf
Дефолтные настройки tmux… спорные. Префикс Ctrl+b неудобен, нумерация окон с нуля, нет мыши. Вот конфиг, к которому я пришёл после нескольких лет использования:
# ~/.tmux.conf
# Префикс: Ctrl+a вместо Ctrl+b (ближе к мизинцу)
unbind C-b
set -g prefix C-a
bind C-a send-prefix
# Нумерация окон и панелей с 1 (не с 0)
set -g base-index 1
setw -g pane-base-index 1
# Автоматическая перенумерация окон при закрытии
set -g renumber-windows on
# Увеличить буфер истории
set -g history-limit 50000
# Уменьшить задержку после Escape (важно для vim)
set -sg escape-time 10
# Включить мышь (resize, select, scroll)
set -g mouse on
# Vi-клавиши в copy mode
setw -g mode-keys vi
# Vi-подобные биндинги для копирования
bind -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi y send-keys -X copy-selection-and-cancel
# Разделение панелей интуитивными клавишами
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
unbind '"'
unbind %
# Новое окно в текущей директории
bind c new-window -c "#{pane_current_path}"
# Быстрое переключение между панелями (Alt+стрелки, без префикса)
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D
# Перезагрузка конфига
bind r source-file ~/.tmux.conf ; display "Config reloaded!"
# 256 цветов и true color
set -g default-terminal "tmux-256color"
set -ag terminal-overrides ",xterm-256color:RGB"
# Строка состояния
set -g status-style 'bg=#1e1e2e fg=#cdd6f4'
set -g status-left '#[fg=#89b4fa,bold] #S '
set -g status-right '#[fg=#a6adc8] %H:%M %d-%b '
set -g status-left-length 30
setw -g window-status-current-style 'fg=#f38ba8 bold'
setw -g window-status-current-format ' #I:#W '
setw -g window-status-format ' #I:#W ' После изменения конфига перезагрузите его без перезапуска tmux:
# Из командной строки tmux (Ctrl+b, затем :)
source-file ~/.tmux.conf
# Или если добавили биндинг из конфига выше
# Ctrl+a, затем r Плагины: TPM
Tmux Plugin Manager (TPM) — менеджер плагинов, который значительно расширяет возможности tmux.
Установка:
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm Добавьте в конец ~/.tmux.conf:
# Плагины
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible' # разумные дефолты
set -g @plugin 'tmux-plugins/tmux-resurrect' # сохранение/восстановление сессий
set -g @plugin 'tmux-plugins/tmux-continuum' # автосохранение сессий
set -g @plugin 'tmux-plugins/tmux-yank' # копирование в системный буфер
# tmux-resurrect: что сохранять
set -g @resurrect-capture-pane-contents 'on'
set -g @resurrect-strategy-vim 'session'
# tmux-continuum: автосохранение каждые 15 минут
set -g @continuum-restore 'on'
set -g @continuum-save-interval '15'
# Инициализация TPM (должно быть в самом конце)
run '~/.tmux/plugins/tpm/tpm' Установка плагинов: Ctrl+a, затем I (заглавная).
tmux-resurrect — killer-фича. При перезагрузке сервера все tmux-сессии теряются. Resurrect сохраняет состояние (окна, панели, рабочие директории) и восстанавливает после перезапуска: Ctrl+a Ctrl+s для сохранения, Ctrl+a Ctrl+r для восстановления.
Практические сценарии
Мониторинг сервера
Создаём рабочее пространство для наблюдения за сервером:
# Скрипт для создания мониторинг-сессии
tmux new-session -d -s monitor
# Первое окно: системные метрики
tmux send-keys -t monitor 'htop' C-m
# Разделяем горизонтально — логи
tmux split-window -v -t monitor
tmux send-keys -t monitor 'journalctl -f' C-m
# Разделяем правую панель — дисковое пространство
tmux split-window -h -t monitor
tmux send-keys -t monitor 'watch -n 5 df -h' C-m
# Подключаемся
tmux attach -t monitor Разработка: IDE в терминале
tmux new-session -d -s dev -c ~/projects/myapp
# Редактор
tmux send-keys -t dev 'vim .' C-m
# Второе окно — терминал для команд
tmux new-window -t dev -c ~/projects/myapp
tmux rename-window -t dev 'shell'
# Третье окно — логи приложения
tmux new-window -t dev -c ~/projects/myapp
tmux rename-window -t dev 'logs'
tmux send-keys -t dev 'tail -f logs/app.log' C-m
tmux select-window -t dev:1
tmux attach -t dev SSH + tmux: правильный workflow
На каждом сервере, к которому подключаюсь регулярно, у меня есть tmux-сессия. Алиас в ~/.bashrc на сервере:
# Подключиться к существующей сессии или создать новую
alias ta='tmux attach || tmux new-session -s main' В ~/.ssh/config на клиенте можно автоматизировать:
Host production
HostName 194.87.104.208
Port 6622
User alex
RemoteCommand tmux attach -t main || tmux new-session -s main
RequestTTY yes Теперь ssh production сразу подключает к tmux-сессии.
Полезные команды
Шпаргалка по наиболее используемым командам:
| Действие | Комбинация |
|---|---|
| Detach (отключиться) | Prefix d |
| Новое окно | Prefix c |
| Следующее окно | Prefix n |
| Предыдущее окно | Prefix p |
| Разделить горизонтально | Prefix " |
| Разделить вертикально | Prefix % |
| Переключить панель | Prefix стрелки |
| Zoom панели | Prefix z |
| Режим копирования | Prefix [ |
| Вставить | Prefix ] |
| Список сессий | Prefix s |
| Командная строка tmux | Prefix : |
| Показать номера панелей | Prefix q |
Альтернативы
Screen — предшественник tmux. До сих пор установлен почти везде. Если нужен терминальный мультиплексор на сервере, где нельзя ставить пакеты — screen, скорее всего, уже есть. Но функциональность и удобство значительно уступают tmux.
Zellij — современная альтернатива на Rust. Красивый UI из коробки, встроенные подсказки по клавишам, плагинная система на WebAssembly. Если начинаете с нуля и не привязаны к tmux — стоит попробовать.
Терминальные мультиплексоры в эмуляторах — iTerm2, WezTerm, Kitty имеют встроенные вкладки и разделение экрана. Но они не переживают разрыв SSH-соединения, что делает tmux незаменимым для серверной работы.
Итог
Tmux — один из тех инструментов, которые кажутся необязательными, пока не начнёшь использовать. После привыкания (пара дней) работа без tmux ощущается как работа без автодополнения в шелле — можно, но зачем.
Начните с малого: установите tmux, создайте сессию, попробуйте разделить экран на панели. Добавьте конфиг из этой статьи. Через неделю вы будете удивляться, как работали без этого.