Шпаргалка по tmux

Шпаргалка по tmux

Анатолий Остроумов

linux

1058 Words

2026-07-02 22:24 +0300


tmux ui

Что такое tmux?

tmux — это консольный мультиплексор для Unix-подобных систем, который позволяет запускать несколько терминальных сессий в одном окне, разделять экран на панели и продолжать работу фоновых процессов даже после закрытия терминала или разрыва SSH-соединения. Инструмент особенно полезен для одновременного редактирования файлов, мониторинга логов и администрирования серверов. Ещё он выглядит очень по-хакерски.

Как установить?

CentOS (нужен подключенный репо EPEL)

$ sudo yum install epel-release
$ sudo yum install tmux

Fedora

$ sudo dnf install tmux

Ubuntu/Debian/Astra

$ sudo apt-get install tmux

Логическая структура сущностей

  • Cессия (session) — это контейнер, который позволяет запустить несколько терминалов внутри одного сеанса, отсоединиться от них, оставив процессы работать в фоне, и позже подключиться обратно. Один сервер tmux может держать запущенными несколько сессий.
  • Окна (windows) — это как вкладки в браузере: каждое представляет отдельную рабочую область внутри сессии. Между окнами можро переключаться. Внутри каждого окна обычно запущен один консольный процесс, хотя, можно сделать разделённое по горизонтали и вертикали окно, где будет несколько одновременно работающих процессов. Пример такой организации рабочего пространства приведён на скриншоте - правое окно разделено по вертикали, справа запущен top, а левое окно - по горизонтали - в верхнем запущен mc, а в нижнем - консоль. И все это запущено в одном сеансе.
  • Сервер (server) - сущность, в контексте которой работают несколько сессий, включая процессы во всех окнах. Сервер должен продолжать работу, пока пользователь неактивен. Технически, сервер открывает unix сокет в файловой системе компьютера, обычно в директории /tmp/tmux-1001/default (где 1001 - идентификатор пользователя). И все клиенты tmux подключаются через этот сокет к нужной сессии. Обычно в системе может быть запущен только один сервер tmux для каждого пользователя.

tmux ui

Общее использование

Запуск НОВОЙ сессии tmux:

$ tmux

Перечислить активные сессии tmux

$ tmux list-sessions 
$ tmux ls 

Присоединиться к УЖЕ работающей сессии

$ tmux a
$ tmux attach

Выключить сервер tmux и закрыть все сессии

$ tmux kill-server

Чтобы выделить текст в окне tmux мышью, зажмите клавишу SHIFT (Windows) или OPTIONS (Mac), а затем используйте мышь как обычно.

Горячие клавиши

КлавишаОписание
CTRL+b <command>отправить команду <command> в tmux вместо консоли
Общие команды
?Показать список комманд (q закрывает список)
:Включить ввод комманд
Работа с окнами
cсоздать окно
,удалить окно
pпереключиться на предыдущее окно
nпереключиться на следующее окно
wвыбор окна стрелочками
09выбор окна по номеру
tзаблокировать окно, включив вывод цифровых часов
Работа с панелями
%Разбить панель горизонтально на две части
"Разбить окно вертикально на 2 части
-Разбить окно вертикально на 2 части *
Перейти на правую панель
Перейти на левую панель
Перейти на верхнюю панель
Перейти на нижную панель
Работа с сессиями
dОтключится от сессии, оставив её работать в фоне
Режим копирования
CTRL + B + PageUPвход в «режим копирования»
PageUp, PageDownпрокрутка
qвыход из «режима копирования»

* требует настройки bind - split-window -v в конфигурационном файле ~/.tmux.conf

Консольные команды

КомандаОписание
tmux -s SESSION_NAMEсоздаёт сессию с именем SESSION_NAME
tmux list-sessionsвыводит список всех активных сессий
tmux lsвыводит список всех активных сессий
tmux attach -t SESSION_NAMEсоединяется с сессией SESSION_NAME
tmux a -t SESSION_NAMEсоединяется с сессией SESSION_NAME
tmux aсоединяется с крайней сессией

В моей версии tmux поддерживает эти команды

vodolaz095@ivory:~/projects/oldcity$ tmux 
attach-session       list-buffers         select-layout
bind-key             list-clients         select-pane
break-pane           list-commands        select-prompt
capture-pane         list-keys            select-window
choose-client        list-panes           send-keys
choose-session       list-sessions        send-prefix
choose-window        list-windows         server-info
clear-history        load-buffer          set-buffer
clock-mode           lock-client          set-environment
command-prompt       lock-server          set-option
confirm-before       lock-session         set-window-option
copy-buffer          move-window          show-buffer
copy-mode            new-session          show-environment
delete-buffer        new-window           show-messages
detach-client        next-layout          show-options
display-message      next-window          show-window-options
display-panes        paste-buffer         source-file
down-pane            pipe-pane            split-window
find-window          previous-layout      start-server
has-session          previous-window      suspend-client
if-shell             refresh-client       swap-pane
join-pane            rename-session       swap-window
kill-pane            rename-window        switch-client
kill-server          resize-pane          unbind-key
kill-session         respawn-window       unlink-window
kill-window          rotate-window        up-pane
last-window          run-shell            
link-window          save-buffer   

Автоматизация tmux

Этот скрипт проверяет, что если запущен tmux, то мы подключаемся к сессии server1, а если нет, то создаём сессию server1 в которой запущенны некие программы.


#!/usr/bin/env bash

if /usr/bin/tmux has-session -t 'server1' 
then
  echo "Attaching to session..."
  /usr/bin/tmux attach-session -t 'server1'
else
  echo "Creating tmux session..."
  /usr/bin/tmux new-session -d -s 'server1' -n 'mc' 'mc'
  /usr/bin/tmux new-window -d -n 'root' 'su'
  /usr/bin/tmux new-window -d -n 'shell'
  /usr/bin/tmux new-window -d -n 'htop' 'htop'
  /usr/bin/tmux new-window -d -n 'nginx' 'journalctl -u nginx -f'
  /usr/bin/tmux new-window -d -n 'dovecot' 'journalctl -u dovecot -f'
  /usr/bin/tmux new-window -d -n 'errors' 'journalctl -p 3 -f'
  /usr/bin/tmux attach-session -t 'server1'
fi

Этот ответ сильно помог - https://unix.stackexchange.com/a/102534/229266

Включаем поддержку мыши

У меня поддержка манипулятора типа мышь заработала, когда я добавит это в ~/.tmux.conf:

set -g mode-mouse on
set -g mouse-resize-pane on
set -g mouse-select-pane on
set -g mouse-select-window on

Применить настройки можно так - $ tmux source ~/.tmux.conf

Меняем командный префикс по умолчанию

set -g prefix C-a

и теперь для отправки команды надо нажать вместо CTRL + b комбинацию CTRL + a. Можно вообще убрать комбинацию по умолчанию (CTRL+b) такой командой:

unbind C-b

Меняем привязки клавиш

Можно добавить или изменить привязки клавиш путём редактирования файла конфигурации ~/.tmux.conf. Допустим, так можно привязать команду горизонтального разбиения окна к комбинации клавиш Ctrl+B+|:

bind | split-window -h

Включаем оповещение об активности в окне

tmux setw -g monitor-activity on
tmux set -g visual-activity on

Подключаемся к сессии tmux при соединении по SSH

В моём случае сработало редактирования файла ./bashrc - я добавил эти строки:


if [[ -z "$TMUX" && -n "$PS1" ]]; then
    tmux attach-session -t default || tmux new-session -s default
fi

Как оно работает:

  1. -z "$TMUX" проверяет, что сеанс пользователя не в окне tmux - это защитит от рекурсии - бесконечного “обёртывания” сессии в tmux
  2. -n "$PS1" проверяет, что терминал интерактивный - то есть, это не ломает SCP/SFTP.
  3. tmux attach-session -t default пытается соединиться с сессией default если она есть
  4. tmux new-session -s default создаёт сессию default если её нет.

Но, использование автоматической консоли tmux может сломать ansible и прочие скрипты, которые запускают команды удалённо через ssh, поэтому, данный код лучше использовать с осторожностью.

Что делать, если при завершении SSH сессии пользователя сервер tmux выключается?

Я встретил такое поведение в Astra Linux версии 1.8.5.46 В моём случае мне помогло включить затяжные сессии для пользователя

$ sudo loginctl enable-linger $USER

Также надо проверить опции в файле /etc/systemd/logind.conf. Параметр KillUserProcess должнен иметь значение no, а параметр KillExcludeUsers - root и имя текущего пользователя:

KillUserProcess=no
KillExcludeUsers=root vodolaz095

После изменения параметров надо перезапустить logind

$ sudo systemctl restart systemd-logind

и, возможно, перезапустить систему.

Стоит отметить, что в дистрибутивах Centos 7...9 и Fedora 41...43 Server утилита tmux работала как надо из коробки.