Каждый, кто работает в терминале, держит открытыми сразу несколько вкладок: в первой смотрит логи, во второй следит за списком запущенных процессов через 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 очень гибок в настройке, чуть позже подробно разберем, как это делается.

Список основных команд

Команда

Описание

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. 

Скриншот терминала с подсветкой первого окна с индексом 0.
Скриншот терминала с подсветкой первого окна с индексом 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

Бесплатный курс «Системный администратор Linux с нуля»

Освойте администрирование Linux на SelectOS и станьте востребованным специалистом.

Зарегистрироваться →

Непрерывные сессии

Представим кошмар любого разработчика: мы подключились к удаленному серверу по SSH, запустили сборку огромного проекта на несколько часов, и пошли пить чай с коллегами. Вернулись и обнаружили, что офисный Wi-Fi «моргнул» и… SSH-сессия разорвана! 

Непрерывные сессии tmux спасают от таких кошмаров наяву. Проверим, как это работает на простом примере. 

Создадим новую сессию:

tmux new -s test

Для имитации непрерывного процесса запустим утилиту ping:

ping 8.8.8.8

Отключимся от текущей сессии:

<prefix> d

После отсоединения в терминале появится сообщение о том, что сессия продолжает работать в фоновом режиме:

Скриншот терминала с сообщением о работе сессии tmux в фоновом режиме.
Скриншот терминала с сообщением о работе сессии tmux в фоновом режиме.

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

tmux ls
Скриншот терминала с сообщением о работе сессии tmux в фоновом режиме.
Скриншот терминала с сообщением о работе сессии tmux в фоновом режиме.

Теперь можно закрыть терминал или даже отключиться от интернета интернет — сессия продолжит функционировать.

Вновь подключимся к нашей сессии и проверим, что 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. Поделитесь, пожалуйста, вашими идеями, хитростями и любимыми плагинами. Будет очень полезно и мне, и всем, кто заглянул в комментарии.

Комментарии (30)


  1. nickolaym
    26.08.2026 09:12

    У тмукса есть возможность выполнить несколько команд одним махом.

    # концевой \ - это для шелла, а не для тмукса
    # (чтобы в ширину строки здесь влезло)
    
    tmux \
      new -n SESSION_NAME_GOES_HERE \; \
      new-window -n MY_WORK -c WORK_DIR \; \
        splitw \; splitw -h \; \
      new-window -n BACKGROUND -c BACKGROUND_DIR ./background_command \; \
      new-window -n HTOP htop

    Удобно использовать тмукс, подключаясь по ссш: при обрыве связи не оборвётся сессия.

    Если на удалённом компьютере написать простенький скрипт (скажем, ~/start-my-tmux)

    tmux attach || tmux new ........ # вот это вот всё, что было выше, например

    то команда

    ssh REMOTE_HOST_GOES_HERE -t ./start-my-tmux

    восстановит либо развернёт сессию, как надо.


    1. iwheksid Автор
      26.08.2026 09:12

      Полезное дополнение! Спасибо!


    1. Qetzlcoatl
      26.08.2026 09:12

      А можно вместо tmux attach || tmux new использовать tmux new -A -s sessionname .


  1. nickolaym
    26.08.2026 09:12

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

    В противном случае получится ни себе ни людям.

    Ни себе - потому что вырабатывается привычка, а потом садишься за чужой ненастроенный терминал, и первым делом начинаешь танцы с бубном, чтобы перенастроить под себя. Каждый раз.

    Ни людям - потому что сядет коллега админить твою машину (или свою машину после тебя), и - ахаха, попался.


  1. nickolaym
    26.08.2026 09:12

    Ещё одна полезная настройка, помимо мыши - это set -g set-clipboard on

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


  1. eps
    26.08.2026 09:12

    К слову, у iTerm2 - macOS Terminal шикарная встроенная поддержка tmux. Она сама включается, если запустить tmux с unicode и control channel, tmux -uCC

    В принципе, мой стандартный способ захода на удалённый сервер:

    ssh user@host -t tmux -uCC new -As default
    

    Запускает сеанс default или подключается к уже запущенному; идемпотентна. И передаёт управление tmux-ом моей терминалке.


  1. domix32
    26.08.2026 09:12

    try zellij


  1. wiki7979
    26.08.2026 09:12

    Вся "полезность", "крутость" этого хвалёного tmux летит к чертям после перезагрузки вашего компа. Никакой resurrect не восстановит ваши SSH сессии, которые вы так старательно настраивали несколько дней.


    1. domix32
      26.08.2026 09:12

      Интересно, было бы послушать что такого вы там настраиваете в соединениях по несколько дней? Плагины на воскрешение лэйаута есть, даже конфиги можно писать, чтобы срабатывала какая-нибудь автокоманда при запуске, которая воскресит само соединение. Настраивать это всё конечно больно, но принципиально не невозможно. Поэтому предлагаю попробовать потрогать zellij - у него конфиги более человечные и настраиваются проще. Да и последний layout воскрешает на раз из коробки да и вообще эргономичнее в сравнении с tmux.


      1. wiki7979
        26.08.2026 09:12

        zellij - то же самое. А настраиваю может не несколько дней, но раз настроил - оно существует несколько дней и может быть закрыто, открыто и тд. Человек к этому привыкает, а после перезагрузки всё пропадает и он должен вспоминать в каком окне что было и что где работало. И насколько я помню, resurrect ничем не помогает - потому что если логин по паролю, то он нигде не будет сохранен. А если настройка восстановления включает в себя создание каких-то программ или конфигов на целевых серверах - то нафиг все это надо. Короче, в теории это все хорошо, но в реальности - теория сталкивается с реальностью


        1. domix32
          26.08.2026 09:12

          Ну, парольный вход на то и парольный, чтобы каждый раз его спрашивать. Не нравится каждый раз перевходить - сделайте вход по публичному ключу или по сертификату.

          или конфигов на целевых серверах

          не на целевых серверах, а на машине с которой вы ходите. делаете tmux --config my_config, а в конфиге что-то вроде этого:

          # my_config
          layout split vertical ratio(1,3)
             panel:
              name "ssh1"
              cmd "ssh -p22 user@host1 -id blabla.crt 'top'"
             panel:
               name "ssh2"
               cmd "ssh -p22 user@host2 -id blabla.crt 'watch tail -f /etc/nginx/logs/log.txt'"

          правильный синтаксис конечно надо будет подсмотреть или у иишек спросить, но общая идея примерно такая. Для zellij аналогично, только там формат в kdl. На целевых машинах ничего доносить не требуется. Если вы конечно инсепшн какой-нибудь устраивать не планируете или у вас рабочее место на удаленной машине.


          1. wiki7979
            26.08.2026 09:12

            Это заморочно - обновлять конфиги после каждого визуального изменения.


            1. domix32
              26.08.2026 09:12

              Из вариантов остаётся все также ручками запускать каждую из команд. Так что не очень понятно на что вы в таком случае жалуетесь.


              1. wiki7979
                26.08.2026 09:12

                Ну мне это не надо. Кому надо наверно заморочится с конфигами. А простым людям этот tmux с zellij - одно неудобство.

                Основной посыл этих тулзов такой что они удобны своей многооконностью и поддержанием открытых соединений. Но это вовсе не так.


                1. randomsimplenumber
                  26.08.2026 09:12

                  А чем удобно пользоваться простому народу?


                  1. wiki7979
                    26.08.2026 09:12

                    Ну обычными терминалами, что уж тут. Только я каждый сервер транслирую через локальный ttyd чтобы доступаться к ним из браузера через закладки и создавать в любых количествах нужные сессии: один клик - новая сессия. Или вместо закладок удобно также держать их все в dashy..

                    По факту, мне не нужны многооконность и сохранение сессий.


                    1. nickolaym
                      26.08.2026 09:12

                      Странная логика!

                      Кококо tmux не переживает ребут хоста, очень неудобно, не хочу пользоваться! И другим буду всячески отсоветовывать.

                      Хочу пользоваться ttyd - который тоже не переживает ребут хоста, да и с сессиями и с обрывом связи там тоже отдельный секс!

                      По факту, просто заменил одно терминальное приложение на другое.

                      А то, что в браузере многооконность есть - это не смущает? Просто окна переехали с серверной стороны на клиентскую.