tmux
| Автор | Николас Мэрриотт (Nicholas Marriott) |
|---|---|
| Первый выпуск | 2007 |
| Тип | терминальный мультиплексор |
| Язык | C |
| Лицензия | ISC |
| Платформы | Linux, macOS, BSD |
| Предшественник | GNU Screen (1987) |
| Файл настройки | ~/.tmux.conf (или ~/.config/tmux/tmux.conf) |
tmux (terminal multiplexer) — программа, которая запускает внутри одного окна терминала несколько независимых псевдотерминалов, раскладывает их на окна и панели и, главное, продолжает держать их запущенными, когда пользователь отключается. Если соединение по SSH оборвалось, долгая сборка или обучение модели не прервутся: достаточно переподключиться и выполнить tmux attach.
История
Идея мультиплексора восходит к GNU Screen (1987).[4] tmux написал Николас Мэрриотт в 2007 году как современную альтернативу с понятной архитектурой «клиент — сервер», вертикальным и горизонтальным делением экрана и скриптуемой конфигурацией. С 2009 года tmux входит в базовую систему OpenBSD, а в Linux-дистрибутивах доступен через пакетный менеджер.[1]
Устройство
tmux состоит из сервера — фонового процесса, который владеет всеми сессиями, — и клиентов, подключающихся к нему из терминалов. Иерархия объектов:[2]
| Объект | Что это |
|---|---|
| Сервер | один процесс на пользователя, общается с клиентами через сокет в /tmp |
| Сессия | набор окон; можно отсоединиться и вернуться |
| Окно | «вкладка», занимает весь экран |
| Панель (pane) | часть окна со своим shell |
Поскольку процессы принадлежат серверу, а не терминалу, закрытие окна эмулятора или разрыв сети не отправляет им сигнал SIGHUP (см. Процессы и сигналы).
Основные команды
Все сочетания клавиш начинаются с префикса — по умолчанию Ctrl+b, затем отпустить и нажать клавишу команды.[3]
| Действие | Команда / клавиши |
|---|---|
| Новая сессия | tmux new -s work |
| Список сессий | tmux ls |
| Подключиться | tmux attach -t work (или tmux a) |
| Отсоединиться | префикс d |
| Новое окно | префикс c |
| Следующее/предыдущее окно | префикс n / префикс p |
| Деление по вертикали / горизонтали | префикс % / префикс " |
| Переход между панелями | префикс + стрелки |
| Увеличить панель на весь экран | префикс z |
| Режим прокрутки и копирования | префикс [ |
| Командная строка tmux | префикс : |
Настройка
Конфигурация пишется на языке команд tmux в ~/.tmux.conf:
# префикс Ctrl+a вместо Ctrl+b
unbind C-b
set -g prefix C-a
bind C-a send-prefix
# мышь: выбор панелей, прокрутка, изменение размеров
set -g mouse on
# нумерация окон с 1 и большая история
set -g base-index 1
set -g history-limit 50000
# vi-клавиши в режиме копирования
setw -g mode-keys vi
Применить без перезапуска: tmux source-file ~/.tmux.conf. Режим копирования с vi-клавишами удобен тем, кто привык к Vim.
Скриптование
Любое действие доступно как команда, поэтому раскладку рабочего места можно описать скриптом:
tmux new-session -d -s dev -n editor
tmux send-keys -t dev:editor 'vim .' C-m
tmux new-window -t dev -n server
tmux send-keys -t dev:server 'npm run dev' C-m
tmux split-window -h -t dev:server 'tail -f app.log'
tmux attach -t dev
Для этого существуют и готовые инструменты: tmuxinator и tmuxp описывают сессии в YAML. Плагины подключаются через TPM (Tmux Plugin Manager); популярный tmux-resurrect сохраняет раскладку между перезагрузками сервера.
Сравнение
- GNU Screen — старше, есть почти везде, умеет работать с последовательными портами; деление экрана и настройка менее удобны.
- Zellij — мультиплексор на Rust с подсказками клавиш на экране и плагинами на WebAssembly.
- Встроенные вкладки терминала (iTerm2, WezTerm, Kitty) удобны локально, но не переживают разрыв SSH; iTerm2 умеет интегрироваться с tmux через
tmux -CC.
Практика
Типичный сценарий на сервере: зайти по SSH, выполнить tmux new -s train, запустить длинную задачу, нажать Ctrl+b d и выйти. Позже — ssh host -t tmux attach -t train. Для фоновых служб, которые должны пережить перезагрузку, правильнее использовать systemd, а не tmux.