
Каждый, кто работает в терминале, держит открытыми сразу несколько вкладок: в первой смотрит логи, во второй следит за списком запущенных процессов через htop, в третьей работает с Git, в четвертой запускает миграции базы данных. При переключении между вкладками легко запутаться, закрыть нужную, а при обрыве связи — потерять запущенные процессы и сессии.
Привет! Я Саломея, продуктовый технический писатель в Selectel. В этой статье поделюсь своим опытом, как с помощью tmux упорядочить этот хаос и сделать работу удобнее. Разделим окно терминала на панели, запустим сессию, которая не прервется при закрытии окна, автоматизируем настройку рабочего пространства. Посмотрим, как выполнять команду сразу на нескольких серверах.
Содержание
→ Что такое tmux и какие задачи он решает
→ Установка tmux
→ Основные команды
→ Окна и панели
→ Непрерывные сессии
→ Синхронизация панелей
→ Скрипты сессий
→ Конфигурация ~/.tmux.conf
→ Заключение
Что такое 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 очень гибок в настройке, чуть позже подробно разберем, как это делается.
Список основных команд
Команда | Описание |
| Создать новую сессию без названия |
| Создать новую сессию с названием |
| Вывести список запущенных сессий |
| Подключиться к конкретной сессии |
| Отключиться от сессии (она останется работать в фоне) |
| Кроме текущей, завершить все сессии и их процессы |
| Завершить сессию |
Окна и панели
После создания сессии можно приступить к организации рабочего пространства. В этом нам помогут окна и панели.
Окно — полноценный терминал внутри сессии. У каждого из них своя история команд, свои запущенные процессы. Окно можно сравнить с вкладкой в браузере — видно только ее содержимое.
Панель — это составная часть окна, которую можно делить на несколько таких соседствующих областей. В каждой — независимый терминал. В одной панели можно редактировать конфигурационный файл, в другой — запустить tcpdump и так далее.
Строка состояния отображается внизу окна и показывает имя текущей сессии, название активного окна, а также разную системную информацию.

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

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

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

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

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

Для переключения между панелями предусмотрены команды:
Команда | Описание |
<prefix> ↑ | На панель выше |
<prefix> ↓ | На панель ниже |
<prefix> ← | На панель слева |
<prefix> → | На панель справа |
Если нам нужно временно развернуть одну панель на все окно, поможет команда:
<prefix> z
Повторное ее выполнение восстанавливает исходный размер панели.
Закрывает активную панель команда:
<prefix> x

Бесплатный курс «Системный администратор Linux с нуля»
Освойте администрирование Linux на SelectOS и станьте востребованным специалистом.
Непрерывные сессии
Представим кошмар любого разработчика: мы подключились к удаленному серверу по 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 с помощью любого текстового редактора:
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. Поделитесь, пожалуйста, вашими идеями, хитростями и любимыми плагинами. Будет очень полезно и мне, и всем, кто заглянул в комментарии.

