Одна сессия — один экран

В конце прошлого урока мы оставили tmux в таком состоянии: сервер работает, сессия course-work существует и отсоединена, внутри неё одна обычная оболочка Bash, готовая принимать команды. Мы остановили цикл с временем, но саму сессию не закрывали. Сейчас мы к ней вернёмся и научимся располагать на экране несколько рабочих мест одновременно.

Сначала стоит проверить, не находимся ли мы уже внутри tmux. Сделать это можно так:

echo "$TMUX"

Если переменная не пуста, сначала выполните tmux display-message -p '#S', чтобы узнать текущую сессию. Если это course-work, продолжайте внутри неё. Иначе отсоединитесь через префикс и d, а затем подключитесь к нужной снаружи. В нашей учебной среде после перезапуска терминала переменная будет пустой, поэтому команда attach уместна. После подключения внизу снова появится зелёная полоса.

Сначала проверим, что сессия на месте:

tmux ls

Вывод должен показать course-work. Если вместо этого tmux сообщает, что сервер не запущен, возможно, машина была перезагружена, среда WSL остановлена или сервер tmux завершился. Это ожидаемое ограничение tmux: он хранит сессии, пока работает его сервер. После перезагрузки Ubuntu или остановки WSL tmux не восстанавливает состояние сам. В таком случае просто создадим сессию заново:

tmux new -s course-work

Если же в выводе tmux ls сессия есть, подключаемся к ней:

tmux attach -t course-work

Зачем нужно несколько окон

Мы работаем с проектом ~/linux-files/project, который создавали в одном из ранних блоков. Его файлы здесь только просматриваем. Для новых заметок и настроек в следующем уроке создадим отдельный ~/linux-workbench. Часто бывает нужно одновременно видеть два контекста: например, в одном месте открыть файл с заметками, а в другом — следить за выводом какой-нибудь команды или просто работать с файловой системой. Открывать для этого новые окна терминала и переключаться между ними можно, но тогда каждый раз приходится заново входить в нужный каталог и заново ориентироваться. tmux даёт другой путь: внутри одной сессии можно держать несколько окон, и переключение между ними происходит внутри того же экрана.

Сейчас у нас в сессии course-work одно окно с оболочкой. У окна есть имя, и по умолчанию tmux называет его по имени запущенной программы — обычно bash. Имя видно в зелёной полосе внизу. Чтобы в окне было легко ориентироваться, дадим ему осмысленное имя.

Для этого используется префикс. Напомним принцип: сначала нажимаем и отпускаем Ctrl+b, затем нажимаем клавишу команды. Для переименования окна после префикса нажимается запятая ,. Полная последовательность: Ctrl+b, затем ,. В нижней полосе появится приглашение ввести новое имя. Старое имя будет подсвечено, и его можно заменить. Наберём notes и нажмём Enter. Теперь в полосе отображается notes, и окно понятно: здесь мы будем работать с заметками.

Создадим второе окно. После префикса нажимается латинская буква c, от create — создать. Полная последовательность: Ctrl+b, затем c. tmux создаст новое окно и сразу переключит нас в него. Имя у нового окна снова будет bash. Переименуем его тем же способом: Ctrl+b, затем ,, набираем monitor, Enter. Это окно будем использовать для наблюдения за выводом команд.

Теперь у нас два окна в одной сессии. Переключаться между ними можно клавишами: Ctrl+b, затем n для следующего окна, от next, и Ctrl+b, затем p для предыдущего, от previous. Порядок окон циклический: после последнего n вернёт к первому. Проверим переключение туда и обратно, обращая внимание на зелёную полосу: в ней видно текущее окно и список всех окон.

Разделяем окно на панели

Окна позволяют переключаться между разными контекстами, но иногда нужно видеть два процесса одновременно, без переключения. Например, в одном углу экрана пусть печатается время, а в другом мы спокойно смотрим файлы проекта. Для этого окно делится на панели. Панель — это часть окна, в которой работает своя оболочка. Окно остаётся тем же самым, но экран внутри него разбивается на несколько прямоугольных областей.

Перейдём в окно monitor: Ctrl+b, затем n или p, пока в полосе не будет выделено monitor. Сейчас в нём одна панель. Разделим её пополам по вертикали, чтобы получить две панели рядом. Для этого после префикса нажимается процент %. На английской раскладке это Shift+5. Полная последовательность: нажать и отпустить Ctrl+b, затем нажать Shift+5. Экран разделится вертикальной чертой: слева и справа будут две оболочки. Обе они принадлежат одному окну monitor.

tmux умеет делить экран и по горизонтали — на верхнюю и нижнюю панели. Для этого после префикса нажимается двойная кавычка ". На английской раскладке это Shift+'. Мы не будем сейчас делить экран дальше, чтобы не превращать урок в перечисление всех комбинаций. Но полезно понимать: вертикальное деление даёт панели рядом, горизонтальное — одну над другой. На практике выбор зависит от того, что удобнее для конкретной задачи. Для нашего случая панели рядом подходят: слева мы запустим наблюдение за временем, справа будем работать с путями и файлами.

Запускаем две работы одновременно

После разделения фокус находится в новой, правой панели. Сначала нажмите Ctrl+b, отпустите, затем стрелку влево, чтобы перейти в левую. В ней запустим цикл из прошлого урока:

while true; do date -Is; sleep 2; done

Строки с временем начнут появляться в левой панели. Оболочка внутри этой панели занята циклом. Теперь нужно перевести фокус в правую панель. Фокус — это панель, в которую идёт ввод с клавиатуры. По умолчанию после разделения фокус остаётся в новой панели, но после наших переключений полезно знать, как управлять им осознанно.

Фокус переводится клавишами со стрелками после префикса. Полная последовательность: Ctrl+b, затем стрелка вправо. Фокус перейдёт в правую панель. Работает это во всех направлениях: стрелка указывает, в какую соседнюю панель мы хотим попасть. Есть и другой способ — Ctrl+b, затем o, от слова other: он переводит фокус в следующую по порядку панель. Но стрелки нагляднее, когда панелей две и они расположены рядом.

В правой панели проверим, где мы находимся и что видим:

pwd

Вывод покажет домашний каталог, если мы не меняли его раньше. Затем посмотрим на проект:

ls -la "$HOME/linux-files/project"

Мы видим обычное содержимое проекта: файлы, подкаталоги, скрытый файл и символьную ссылку. Всё это нам уже знакомо, и сейчас главное не содержимое, а сам факт: в левой панели продолжает печататься время, а мы в правой спокойно набираем команды. Это и есть одновременная работа в одном окне.

Управляем размером и фокусом

Когда панелей две, у каждой своя ширина. По умолчанию при вертикальном разделении ширина делится пополам. Иногда хочется отдать одной панели больше места. Для этого после префикса нажимается Ctrl+стрелка. Удержание Ctrl вместе со стрелкой меняет размер текущей панели. Не будем задавать точные размеры: достаточно попробовать один раз подвигать границу и вернуть её на место. Важно понимать, что изменение размера — это действие с текущей панелью, а не создание новой.

Останавливаем циклы и закрываем лишнее

Левая панель всё это время печатала время. Чтобы остановить цикл, сначала переведём фокус в левую панель: Ctrl+b, затем стрелка влево. Нажмём Ctrl+C. Вывод остановится, оболочка в левой панели снова готова к вводу.

Теперь у нас в окне monitor две панели с обычными оболочками. По условию урока мы хотим оставить окно monitor с одной панелью, а окно notes — тоже с одной. Лишнюю панель нужно закрыть. Для закрытия текущей панели достаточно выйти из её оболочки командой:

exit

Сначала убедимся, что фокус в той панели, которую мы хотим закрыть. Команда exit завершает оболочку внутри панели. Если в окне были другие панели, они останутся, а текущая исчезнет. Если панель была последней в окне, закроется и само окно. Поэтому важно закрывать именно лишнюю панель, а не выходить из всех подряд. В нашем случае в окне monitor две панели. Выберем ту, которую хотим закрыть, и выполним в ней exit. Останется одна панель.

Специальную команду tmux для принудительного закрытия панели мы не используем. У неё есть свои применения, но на этом этапе проще и безопаснее выйти из оболочки. Так мы не рискуем задеть чужую панель или закрыть не то, что нужно.

Возвращаемся к одному окну с заметками

Проверим, как выглядит список окон. Перейдём в окно notes: Ctrl+b, затем n или p, пока в полосе не будет выделено notes. Здесь у нас одна панель с оболочкой. В окне monitor тоже одна панель. Задача урока — видеть несколько рабочих мест одновременно — выполнена, и мы понимаем, как эти места устроены.

Теперь нам нужно оставить сессию в предсказуемом состоянии для следующего урока. Внутри окна notes просто работает оболочка. В окне monitor тоже работает оболочка. Отключимся от сессии через префикс: Ctrl+b, затем d. Экран вернётся к обычному терминалу.

Проверим состояние:

tmux ls

Вывод покажет нашу сессию course-work с двумя окнами. Если хочется увидеть подробности, можно выполнить:

tmux list-windows -t course-work

Опция -t указывает целевую сессию, а list-windows перечисляет окна. Вывод будет похож на такой:

0: notes* (1 panes)
1: monitor- (1 panes)

Звёздочка обозначает активное окно, чёрточка — предыдущее. У каждого окна по одной панели. Именно это нам и нужно. Сессия отсоединена, сервер работает, окна готовы к следующему уроку.

Внутри сессии tmux мы организовали два рабочих места — окна notes и monitor. Окно — это отдельный контекст внутри сессии, со своим именем и своей оболочкой. Имена мы задали через префикс Ctrl+b и запятую, а новое окно создали через Ctrl+b и c. Переключение между окнами выполняется клавишами n и p после префикса. Окна удобны, когда нужно держать несколько независимых задач в одной сессии и не загромождать экран.

Когда понадобилось видеть два процесса одновременно, мы разделили окно на панели. Вертикальное деление через Ctrl+b и % дало две панели рядом. В левой мы запустили цикл с временем, а в правой работали с файлами проекта. Фокус между панелями переводится стрелками после префикса, размер меняется через Ctrl+стрелку, а zoom через z временно разворачивает панель на весь экран. Остановив цикл через Ctrl+C, мы закрыли лишнюю панель командой exit, не прибегая к принудительному уничтожению. Итоговое состояние: сессия course-work с двумя окнами, в каждом по одной панели, сессия отсоединена.

Практика: сессии, окна и панели tmux

В уроке мы разложили рабочие места на три уровня: сессия, окно и панель. Поняли, как разделить окно на две панели, как переводить фокус стрелками после префикса и почему Ctrl+C останавливает команду, а не закрывает панель. Теперь проверим это на трёх задачах: сопоставим уровни с ситуациями, разберём фокус и Ctrl+C в тесте, а потом спланируем работу с двумя панелями и аккуратным закрытием только своей.

Сессия, окно или панель

Слова tmux легко перепутать: и сессия, и окно, и панель дают нам оболочку. Различим их по ситуациям.

Сопоставьте каждый уровень tmux с подходящей ситуацией. Каждый вариант слева используется ровно один раз, и каждое описание справа — тоже.

Сессия
Окно
Панель
Отдельный контекст внутри сессии со своим именем, например notes или monitor, между которыми переключаются через Ctrl+b и n либо p.
Часть окна со своей оболочкой, появляющаяся после деления экрана, например, через Ctrl+b и % рядом или через Ctrl+b и " друг над другом.
Именованный рабочий сеанс внутри сервера tmux, у которого есть имя course-work и который можно отсоединить и подключить заново командой tmux attach.

Фокус панели и Ctrl+C

В окне monitor две панели: слева идёт цикл с временем, справа ученик работает с файлами. Разберём, куда попадёт ввод и что сделает Ctrl+C.

11

В сессии course-work открыто окно monitor. Оно разделено вертикально через Ctrl+b, затем % — получились левая и правая панели. В левой запущена команда while true; do date -Is; sleep 2; done, и строки с временем печатаются каждые две секунды. Фокус сейчас в левой панели. Ученик нажимает Ctrl+C. Что произойдёт?

Две панели и аккуратное закрытие своей

Теперь нужно спланировать работу заранее: у нас будет окно с двумя панелями, в одной пойдёт наблюдение за временем, а в другой — обычные команды. В конце оставим только одну панель, не задев чужие.

Учебная среда: сервер tmux работает, сессия course-work существует и отсоединена, в ней уже есть окна notes и monitor с одной панелью каждое. Мы не должны их ломать, переименовывать или закрывать. Также в этой учётной записи могут быть другие сессии, которые мы не трогаем.

Спланируйте свои действия по шагам так, как будто вы делаете это сейчас в терминале. Условия:

  1. подключитесь к сессии course-work, если вы ещё снаружи;
  2. создайте новое окно внутри этой сессии и дайте ему осмысленное имя, например watch;
  3. разделите его вертикально на две панели рядом;
  4. в левой панели запустите команду, которая печатает время каждые пару секунд и не заканчивается сама;
  5. переведите фокус в правую панель и убедитесь, что ввод теперь идёт в неё (для этого опишите, что вы видите и как это проверить);
  6. остановите цикл в левой панели, не завершая сессию и не убивая сервер tmux;
  7. закройте только лишнюю панель так, чтобы в окне watch осталась одна панель, а окна notes и monitor и все остальные сессии остались нетронутыми;
  8. отсоединитесь от сессии, оставив её работать.

Укажите последовательность шагов с командами и нажатиями клавиш. Поясните, почему в шагах 6 и 7 вы не используете tmux kill-server, tmux kill-session и подобные команды. Имя нового окна должно быть свободно: перед созданием посмотрите список окон. Если вы уже внутри другой сессии, сначала отсоединитесь и подключитесь к course-work; не создавайте окно в случайной сессии.

Обсуждение урока

0
Комментарии видны всем. Чтобы участвовать в обсуждении, войдите или зарегистрируйтесь.
Модерация сообщества

Пожаловаться на комментарий

Расскажите модераторам, что именно требует внимания.