Введение
Каждый, кто работает в терминале, держит открытыми сразу несколько вкладок: в первой смотрит логи, во второй следит за списком запущенных процессов через htop, в третьей работает с Git, в четвертой запускает миграции базы данных. При переключении между вкладками легко запутаться, закрыть нужную, а при обрыве связи — потерять запущенные процессы и сессии.
Привет! Я Саломея, продуктовый технический писатель в Selectel. В этой статье поделюсь своим опытом, как с помощью tmux упорядочить этот хаос и сделать работу удобнее. Разделим окно терминала на панели, запустим сессию, которая не прервется при закрытии окна, автоматизируем настройку рабочего пространства. Посмотрим, как выполнять команду сразу на нескольких серверах.
Что такое tmux и какие задачи он решает
tmux (terminal multiplexer) — открытая консольная утилита-мультиплексор. Она позволяет создавать несколько сессий терминала в одном окне и управлять ими. Каждая сессия состоит из окон, а те, в свою очередь, — из панелей. Вместо десятка вкладок с отдельными процессами tmux помогает организовать структурированное рабочее пространство.
Можно решать разные задачи одновременно:
- сохранять работу процессов при разрыве соединения по SSH;
- делить экран на панели для независимых процессов;
- автоматизировать подготовку рабочего пространства.
Полный список возможностей утилиты вы можете прочитать в репозитории проекта на GitHub.
Установка tmux
Утилита доступна почти для всех Unix-систем. В Ubuntu и Debian установить tmux можно командой:
sudo apt update && sudo apt install tmux
Убедимся, что утилита установлена:
tmux -V
В выводе увидим номер установленной версии tmux — например, tmux 3.6.
Команды установки для других ОС можно подсмотреть на страничке документации.
Основные команды
Префикс tmux
Префикс — это комбинация клавиш для вызова внутренних команд программы. По умолчанию установлен префикс Ctrl+b. Обозначать его в примерах мы будем так же — <prefix>. Чтобы выполнить команду, нужно нажать сочетание клавиш для префикса, затем отпустить обе клавиши, и наконец, нажать нужную клавишу действия.
Если какие‑то комбинации покажутся неудобными, расстраиваться не стоит — tmux очень гибок в настройке, чуть позже подробно разберем, как это делается.
Список основных команд
| Команда | Описание |
tmux | Создать новую сессию без названия |
tmux new -s <name> | Создать новую сессию с названием <name> |
tmux ls | Вывести список запущенных сессий |
tmux a -t <name> | Подключиться к конкретной сессии <name> |
<prefix> d | Отключиться от сессии (она останется работать в фоне) |
tmux kill-session -a | Кроме текущей, завершить все сессии и их процессы |
tmux kill-session -t <name> | Завершить сессию <name> и ее процессы |
Окна и панели
После создания сессии можно приступить к организации рабочего пространства. В этом нам помогут окна и панели.
Окно — полноценный терминал внутри сессии. У каждого из них своя история команд, свои запущенные процессы. Окно можно сравнить с вкладкой в браузере — видно только ее содержимое.
Панель — это составная часть окна, которую можно делить на несколько таких соседствующих областей. В каждой — независимый терминал. В одной панели можно редактировать конфигурационный файл, в другой — запустить tcpdump и так далее.
Строка состояния отображается внизу окна и показывает имя текущей сессии, название активного окна, а также разную системную информацию.

Окна
По умолчанию при создании сессии создается одно окно с индексом 0.

Чтобы создать новое окно и переключиться на него, выполним команду:
<prefix> c

Теперь у нас два окна: с индексами 0 и 1. Активное отмечено звездочкой *.
Для переключения между окнами используются команды:
| Команда | Описание |
<prefix> n | Переключиться на следующее окно |
<prefix> p | Переключиться на предыдущее окно |
<prefix> <index> | Переключиться на окно с конкретным номером <index> от 0 до 9 |
Чтобы не путаться в окнах, их можно именовать с помощью команды:
<prefix> ,
Нужно будет ввести новое имя и нажать Enter. Теперь в строке состояния легко найти нужное окно по понятному названию.

Чтобы закрыть окно, нужно на него переключиться и выполнить команду:
<prefix> &
Панели
Панели можно получать, деля окна по вертикали и горизонтали.
Разделить окно вертикально можно командой:
<prefix> %

Чтобы сделать то же самое, но по горизонтали:
<prefix> "

Для переключения между панелями предусмотрены команды:
| Команда | Описание |
| <prefix> ↑ | На панель выше |
| <prefix> ↓ | На панель ниже |
| <prefix> ← | На панель слева |
| <prefix> → | На панель справа |
Если нам нужно временно развернуть одну панель на все окно, поможет команда:
<prefix> z
Повторное ее выполнение восстанавливает исходный размер панели.
Закрывает активную панель команда:
<prefix> x
Непрерывные сессии
Представим кошмар любого разработчика: мы подключились к удаленному серверу по SSH, запустили сборку огромного проекта на несколько часов, и пошли пить чай с коллегами. Вернулись и обнаружили, что офисный Wi-Fi «моргнул» и… SSH-сессия разорвана!
Непрерывные сессии tmux спасают от таких кошмаров наяву. Проверим, как это работает на простом примере.
Создадим новую сессию:
tmux new -s test
Для имитации непрерывного процесса запустим утилиту ping:
ping 8.8.8.8
Отключимся от текущей сессии:
<prefix> d
После отсоединения в терминале появится сообщение о том, что сессия продолжает работать в фоновом режиме:

Посмотрим на список активных сессий и убедимся, что нужная сессия работает в фоновом режиме:
tmux ls

Теперь можно закрыть терминал или даже отключиться от интернета интернет — сессия продолжит функционировать.
Вновь подключимся к нашей сессии и проверим, что ping продолжает выполняться:
tmux a -t test
Мультиплексор tmux позволяет запускать любые команды и не бояться, что их выполнение прервется из-за обрыва связи или человеческого фактора.
Сессии можно сделать и по-настоящему бессмертными: они будут сохраняться не только после отключения клиентской стороны, но даже после перезагрузки самого сервера!
Для этого придется познакомиться с плагинами tmux-resurrect и tmux-continuum. Они как раз предназначены для сохранения и полного восстановления сессий со всеми окнами, панелями и выполняемыми процессами.
Подробнее на их возможностях останавливаться не будем, так как сильно уйдем в сторону от ознакомления с tmux. Вся информация по их установке и настройке доступна по ссылкам выше, которые ведут в репозитории проектов на GitHub.
Синхронизация панелей
Синхронизация панелей — это режим, при котором команды, вводимые в одной панели, повторяются и выполняются во всех других в пределах текущего окна.
Нужно подключиться по SSH к нескольким серверам и обновить на них пакеты? — выручит синхронизация панелей. Быстро поднять Docker-контейнеры на разных серверах или в разных директориях? — снова она. Остановить все микросервисы для деплоя новой версии? — полагаю, уже ясно, что выручит в подобных операциях.
Чтобы включить этот режим, подключимся к сессии с несколькими панелями:
tmux a -t <name>
В коде выше, <name> — имя сессии.
Вызовем командную строку tmux:
<prefix> :
Теперь включим режим синхронизации панелей, введя:
setw synchronize-panes
Нажимаем Enter.
Команда setw — это сокращение от set-window-option, она включает опцию только для текущего окна. В скриптах автоматизации tmux, о которых поговорим позже, удобнее использовать именно полную форму команды — например set-window-option или synchronize-panes, — так как будет легче понять, что же мы подразумевали, когда писали код.
«Если можно применить опцию только для текущего окна, то можно и для всех окон?» — наверняка подумали вы. Да, конечно. Флаги -t и -g позволяют управлять областью настройки. По умолчанию каждая команда применяется только к текущему окну.
Если нужно включить режим синхронизации для конкретного окна, используется флаг -t, например:
setw -t <name>:<index> synchronize-panes
Здесь, <name> — имя сессии, а <index> — номер окна.
Если же нужно включить этот режим для всех окон сессии, пригодится флаг -g:
setw -g synchronize-panes
Теперь попробуем ввести какую-нибудь команду в активной панели — например, ping 8.8.8.8. Ввод команды мгновенно воспроизводится во всех панелях окна.

Чтобы отключить синхронизацию панелей, снова подключимся к сессии:
tmux a -t <name>
Не забудем, что <name> — имя сессии.
Так же вызовем командную строку tmux:
<prefix> :
Выключим режим той же командой:
setw synchronize-panes
Ввод в панелях снова стал независимым.
Скрипты сессий
Лень — двигатель прогресса. Зачем каждый раз вручную создавать сессию, окна, панели, запускать команды, если это можно автоматизировать? Давайте избавим себя от рутины с помощью bash-скрипта. Пусть он настраивает рабочее пространство.
Вот пример простого bash-скрипта main.sh, который создаст новую сессию, окна, разделит окна на панели и запустит команды:
#!/bin/bash
# Название сессии
SESSION="main"
# Создаем первое окно с названием "resources"
tmux new-session -d -s $SESSION -n "resources"
# Отправляем текст на ввод для запуска утилиты htop
tmux send-keys -t $SESSION:0 "htop" C-m
# Делим окно горизонтально
tmux split-window -v -t $SESSION:0
# Отправляем текст на ввод для запуска утилиты df
tmux send-keys -t $SESSION:0.1 "df -h" C-m
# Создаем второе окно с названием "ping"
tmux new-window -t $SESSION -n "ping"
# Отправляем текст на ввод для запуска утилиты ping
tmux send-keys -t $SESSION:1 "ping 8.8.8.8" C-m
# Создаем третье окно с названием "logs"
tmux new-window -t $SESSION -n "logs"
# Отправляем текст на ввод для вывода логов
tmux send-keys -t $SESSION:2 "tail -f /var/log/syslog" C-m
# Подключаемся к сессии и открываем первое окно "resources"
tmux attach -t $SESSION:0
Флаг -d создает сессию в фоновом режиме, чтобы сначала ее можно было настроить. Команда send-keys отправляет команду в нужную панель для выполнения, а C-m — это аналог нажатия Enter на клавиатуре.
Перед запуском скрипта дадим ему права на исполнение:
chmod +x main.sh
Стартует наша автоматизация одной командой:
./main.sh
После запуска мы получаем сессию с тремя окнами: resources, ping и logs. Благодаря команде attach -t $SESSION:0 сразу попадаем в первое созданное окно — в нашем примере это resources.
С помощью скрипта можно настроить любое количество окон и панелей, распределить все как удобно и запустить любые команды. Теперь наше рабочее пространство разворачивается быстро и без усилий.
С течением времени поддерживать длинные цепочки команд send-keys станет утомительным делом. Это верный знак, что пора переходить к тяжелой артиллерии — инструментам для управления сессиями через YAML- или JSON-файлы:
- Tmuxinator (на Ruby) — описывает структуру окон и панелей в простом YAML-файле, а затем разворачивает проект одной короткой командой вида
tmuxinator start myfirstproject; - tmuxp (на Python) — альтернатива для тех, кто предпочитает Python или JSON. Большой плюс утилиты — наличие библиотеки
libtmux, которая предоставляет полноценный Python API. Управлять окнами и панелями можно прямо из скриптов на Python.
Эти инструменты значительно упрощают создание сложных рабочих пространств.
Конфигурация ~/.tmux.conf
Что может быть приятнее, чем настройка утилиты под себя? Конфигурационный файл ~/.tmux.conf позволяет это сделать.
Откроем или создадим файл конфигурации ~/.tmux.conf с помощью любого текстового редактора:
̶v̶i̶m̶ nano ~/.tmux.conf
В качестве примера рассмотрим самые популярные настройки, которые значительно улучшают опыт взаимодействия с tmux:
# Включаем поддержку мыши. Это позволяет выделять текст, листать историю и менять размер панелей мышкой
set -g mouse on
# Меняем нумерацию окон и панелей с 0 на 1
# Внимание! В скриптах вроде нашего main.sh придется заменить 0 на 1, например, $SESSION:0 станет $SESSION:1)
set -g base-index 1
setw -g pane-base-index 1
# Увеличиваем историю буфера прокрутки
set -g history-limit 5000
# Меняем префикс Ctrl + b на более удобное сочетание клавиш, например Ctrl + a
unbind C-b
set -g prefix C-a
bind C-a send-prefix
# Применение изменений в конфигурационный файл по горячей клавише. Чтобы применить изменения, нужно нажать <prefix> и заданную горячую клавишу, например, r
bind r source-file ~/.tmux.conf ; display-message "Changes applied"
Сохраняем файл ~/.tmux.conf и применяем изменения вручную:
tmux source-file ~/.tmux.conf
Конфигурационный файл ~/.tmux.conf можно настроить более гибко. Полный список опций доступен в репозитории проекта на GitHub или в справке по команде man tmux.
Заключение
Tmux — это полноценный инструмент, который упрощает и делает удобнее работу в консоли. Он экономит и время, и нервы. Вместо множества терминалов — один. Попробуйте провести в мультиплексоре хотя бы несколько часов. Вы удивитесь, как обходились без него раньше.
Наверняка среди читателей есть те, кто уже работает в tmux. Поделитесь, пожалуйста, вашими идеями, хитростями и любимыми плагинами. Будет очень полезно и мне, и всем, кто заглянул в комментарии.