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

Что такое 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:
$ 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 | выбор окна стрелочками |
0…9 | выбор окна по номеру |
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
Как оно работает:
-z "$TMUX"проверяет, что сеанс пользователя не в окне tmux - это защитит от рекурсии - бесконечного “обёртывания” сессии вtmux-n "$PS1"проверяет, что терминал интерактивный - то есть, это не ломает SCP/SFTP.tmux attach-session -t defaultпытается соединиться с сессиейdefaultесли она есть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 работала как надо из коробки.