tmux
Терминальный мультиплексор — сессии, которые переживают обрыв связи, окна и панели в одном терминале
tmux запускает сервер, внутри которого живут сессии. Сессия содержит окна (как вкладки), окно делится на панели. От сессии можно отключиться (detach) — программы внутри продолжат работать — и позже подключиться снова, в том числе из другого SSH-соединения.
Синтаксис
tmux # новая сессия и подключиться к ней
tmux команда [опции] # управлять сервером из оболочки
Внутри tmux команды подаются сочетаниями: сначала префикс Ctrl+b, отпустить, затем клавиша. Дальше это записано как C-b d — «Ctrl+b, потом d».
Цели (-t) записываются как сессия:окно.панель: work, work:1, work:logs.0. Окна и панели нумеруются с 0.
Сессии
| Команда | Что делает |
|---|---|
tmux new -s имя | новая сессия с именем (полная форма — new-session) |
tmux new -d -s имя | создать в фоне, не подключаясь |
tmux new -d -s имя 'команда' | сессия, в которой работает команда; когда она завершится, сессия закроется |
tmux new -A -s имя | подключиться, если сессия есть, иначе создать |
tmux ls | список сессий (list-sessions) |
tmux attach -t имя | подключиться (a, attach-session); без -t — к последней |
tmux has-session -t имя | код 0, если сессия существует — для скриптов |
tmux rename-session -t старое новое | переименовать |
tmux kill-session -t имя | закрыть сессию со всеми программами в ней |
tmux kill-server | закрыть всё |
Окна и панели из командной строки
| Команда | Что делает |
|---|---|
tmux new-window -t сессия -n имя | новое окно |
tmux split-window -h / -v | разделить панель: слева-справа / сверху-снизу |
tmux select-window -t сессия:имя | переключить окно |
tmux select-pane -t сессия:0.1 | переключить панель |
tmux list-windows -t сессия / list-panes | список окон / панелей |
tmux kill-window -t … / kill-pane -t … | закрыть окно / панель |
tmux send-keys -t цель 'текст' Enter | «напечатать» текст в панель (C-m — тоже Enter) |
tmux capture-pane -p -t цель | вывести содержимое панели в stdout; -S - — со всей историей |
tmux display -p '#S:#I.#P' | имя текущей сессии, номер окна и панели |
tmux source-file ~/.tmux.conf | перечитать конфиг |
Клавиши (после C-b)
| Клавиша | Действие |
|---|---|
d | отключиться от сессии (detach) |
s / w | выбрать сессию / окно из дерева |
$ | переименовать сессию |
c | новое окно |
n / p / l | следующее / предыдущее / последнее окно |
0…9 | окно по номеру |
, | переименовать окно |
& | закрыть окно (с подтверждением) |
% | разделить панель на левую и правую |
" | разделить панель на верхнюю и нижнюю |
стрелки / o | перейти в соседнюю / следующую панель |
z | развернуть панель на всё окно и обратно |
x | закрыть панель (с подтверждением) |
{ / } | поменять панель местами с соседней |
Space | следующая раскладка панелей |
! | вынести панель в отдельное окно |
q | показать номера панелей |
[ | режим прокрутки и копирования; PgUp — сразу с прокруткой вверх |
] | вставить скопированное |
: | командная строка tmux (kill-session, resize-pane -D 5…) |
? | список всех сочетаний |
Режим копирования
По умолчанию клавиши как в emacs. Вход — C-b [, выход — q или Escape. Стрелки и PgUp/PgDn листают историю.
| Клавиша (emacs) | Клавиша (vi) | Действие |
|---|---|---|
C-Space | Space | начать выделение |
M-w | Enter | скопировать и выйти |
C-s / C-r | / / ? | поиск вперёд / назад |
q | q | выйти |
vi-клавиши включаются в конфиге: setw -g mode-keys vi.
~/.tmux.conf
| Строка | Что делает |
|---|---|
set -g mouse on | мышь: выбор панели, прокрутка колесом, изменение размера |
set -g history-limit 50000 | длина истории панели (по умолчанию 2000 строк) |
set -g base-index 1 | нумеровать окна с 1 |
setw -g mode-keys vi | vi-клавиши в режиме копирования |
set -g prefix C-a + unbind C-b | сменить префикс |
bind r source-file ~/.tmux.conf | C-b r перечитывает конфиг |
Примеры
# долгую команду — в отдельную сессию, отключиться и вернуться позже
tmux new -s build
# … запусти команду, нажми C-b d …
tmux ls
tmux attach -t build
# запустить процесс в фоновой сессии сразу
tmux new -d -s worker 'python3 -m http.server 8000'
# подключиться к существующей или создать
tmux new -A -s main
# раскладка из скрипта: окно с двумя панелями
tmux new -d -s dev
tmux split-window -h -t dev
tmux send-keys -t dev:0.1 'top' Enter
# посмотреть, что выводит панель, не подключаясь
tmux capture-pane -p -t dev:0.0
# существует ли сессия
tmux has-session -t dev 2>/dev/null && echo "есть"
# закрыть сессию
tmux kill-session -t dev
Подводные камни
C-b— это префикс, а не команда. Нажми и отпустиCtrl+b, потом нужную клавишу. Зажатый Ctrl на второй клавише даст другое сочетание.%и"путают.%делит на левую и правую части (split-window -h),"— на верхнюю и нижнюю.- Колесо мыши не листает историю, пока не включён
set -g mouse on. Без этого —C-b [и стрелки илиPgUp. exitв последней панели закрывает сессию, а не отключает от неё. Чтобы оставить программы работать —C-b d.- Сессия, созданная с командой, исчезает вместе с командой.
tmux new -d -s job 'sleep 1'через секунду пропадёт изtmux ls. - tmux внутри tmux: префикс перехватывает внешний. До внутреннего доходит по
C-b C-b. attachвне терминала не работает («open terminal failed: not a terminal»). Из скриптов управляй черезsend-keys,capture-pane,has-session.- Сессия живёт, пока жив сервер tmux. Перезагрузка машины или перезапуск контейнера её уничтожит.
- После правки
~/.tmux.confработающий сервер изменений не видит —tmux source-file ~/.tmux.conf.