← Весь справочник

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-SpaceSpaceначать выделение
M-wEnterскопировать и выйти
C-s / C-r/ / ?поиск вперёд / назад
qqвыйти

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 vivi-клавиши в режиме копирования
set -g prefix C-a + unbind C-bсменить префикс
bind r source-file ~/.tmux.confC-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.

См. также

ssh · ps · kill