tmux example

Вступление


Довольно долгое время я использовал в своей работе screen. Но со временем он меня перестал устраивать. Я начал искать альтернативы. Такой альтернативой является tmux. На многих порталах его описывают так: «Это тот-же screen, только на стероидах». Сначала я не мог понять почему такое сравнение пока не попробовал. Скажу честно, я на него не с первого раза перешел. Раза три-четыре пробовал, возвращался к screen’у. Но tmux все же победил.

Важный момент. К предыдущей статье я получил немало комментариев с альтернативами screen и tmux. Тут, как говорится, на вкус и цвет карандаши разные. Второй момент, на который хотел обратить внимание, предполагается, что у читателя нет доступа к графической оболочке. Все что есть в его арсенале — терминал (CLI) и набор команд, которыми он может воспользоваться.

Установка


Ну что ж, перейдем к установке tmux. Достаточно выполнить первую команду, чтобы его установить. После этого можно будет его запустить, набрав команду tmux в терминале.

Для более опытных пользователей есть возможность собрать tmux из репозитория или скачать архив себе на компьютер. Как это сделать, описано тут.

Базовые сочетания клавиш


Тут как и в случае со screen’ом, добавлю только ссылку. Дальше берем и начинаем использовать. Заучивать, запоминать не нужно. Единственный нюанс, комбинации клавиш отличаются, но это легко можно поправить через файл настроек.

Настройки


По умолчанию tmux, что называется, «с коробки», настроен довольно качественно. Вам не нужно настраивать положение панели с вкладками, каким цветом их подсвечивать, и другие настройки, как это было в screen. Но если вдруг вам понадобится конфигурационный файл, то возьмите себе на заметку: называться он должен .tmux.conf; поместить его нужно в домашнюю директорию пользователя.

Хочу поделиться полезной настройкой, без которой мне приходилось создавать заново сессию tmux. Опишу ее более подробно. Рабочая машина у меня под управлением ОС Windows. Для подключения к удаленному серверу используется putty и pagent (для добавления ключей). Когда добавляешь ключ в pagent, нужно вводить пароль (passphrase — вы его указываете при создании ключей ssh). В putty для каждого соединения установлена вот эта галочка:

PuTTY Configuration sshТакие особенности работы windows + putty + удаленное соединение по ssh. Эта галочка нужна, чтобы работал SSH-agent forwarding.

Так вот, вернемся к проблеме. Если вы вдруг потеряли связь с сетью или в офисе внезапно отключили электричество, то tmux, конечно же, сохранит сессию. И при повторном подключении к этой сессии вежливо попросит ввести пароль для ключа. Так будет каждый раз. Т.е. перестанет работать SSH-agent forwarding. Это можно поправить, если завершить текущую сессию tmux и переподключиться к удаленному серверу. С одной стороны это не так критично.

Но со временем эта проблема доставляет довольно много неудобств и хочется ее решить раз и навсегда. Чтобы решить эту проблему нужно добавить настройки в файл .bashrc, который находится в домашней директории пользователя:

Попробую описать, что происходит, когда вы подключаетесь к удаленному серверу с включенным SSH-agent forwarding. Когда ssh-клиент (в данном случае putty), с включенным SSH-agent forwarding, подсоединяется к серверу, то он создаёт сокет, через который можно получить этот самый ключ. Также он создаёт переменную $SSH_AUTH_SOCK, которая ссылается на этот сокет. Эту переменную наследует запущенный shell (оболочка, которая обрабатывает команды пользователя) в рамках текущей сессии. Кроме этой переменной, создаются еще несколько переменных: $SSH_CLIENT, $SSH_CONNECTION, $SSH_TTY, в которых хранится информация о текущем ssh-подключении. Когда произойдет обрыв связи, то менеджер терминалов, в данном случае tmux, сохранит сессию со старыми значениями этих переменных. И когда мы заново будем подключаться к удаленному серверу, то будет создан новый сокет с новыми значениями. Но они не попадут в старую сессию менеджера терминалов. Поэтому нам нужно дать понять shell, что мы хотим, чтобы он сохранял эти значения и использовал их при повторном подключении, если они есть.

tmux в деле


Пришло время проверить tmux в работе. Мы уже знаем как его запустить. Достаточно набрать tmux.

tmux first start example

  1. Рабочая область. Панель (pane — из документации к tmux).
  2. Строка состояния. На ней размещаются вкладки и другие элементы.
  3. Вкладка с именем по умолчанию.

Мы рассмотрели начальное состояние tmux. Если вы читали предыдущую статью, то вы могли заметить, что начальное состояние, да и вообще внешний вид tmux, не очень то и отличается от screen. За исключением того, что статусная строка нам доступна изначально. Давайте теперь рассмотрим tmux на примере более сложной задачи.



Для этого нам понадобиться репозиторий. Если вы его себе не клонировали на компьютер, то выполните следующую команду:

git clone https://github.com/var-bin/terminalForCoder__WSD.git

Далее запустите tmux. Для начала поработаем с вкладками. Нам понадобится 2-3 вкладки. Чтобы создать новую вкладку, нужно нажать следующие сочетания клавиш:

Ctrl + b, c - создать новую вкладку

Следующим шагом будет переименование вкладок. Для этого используйте:

Ctrl + b, , - переименовать вкладку

Для того, чтобы переключаться между вкладками, воспользуйтесь этими клавишами:

Ctrl + b, int - переключиться на нужную вкладку (int - номер вкладки 0 - 9)

Или

Ctrl + b, w - интерактивное переключение вкладок

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

Ctrl + b, % - разбить текущую панель на две новых по вертикали

Теперь давайте запустим в той панели, что слева, какую-то утилиту. К примеру, midnight commander (любую другую утилиту) с помощью команды:

mc

Для перемещения между панелями, используйте эти сочетания клавиш:

Ctrl + b, < ^ > v - перемещение между панелями 

А в той панели, что справа, запустим наше тестовое приложение. Это простой чат, написанный на node.js и socket.io. Этот пример взят с официального сайта socket.io. Единственное, что я добавил — это немного логирования, чтобы мы видели, что оно работает. Для этого нужно перейти в директорию %repoName%/tmux/chat-example. И выполнить команды:

npm i
node index.js

%repoName% — имя директории, в которую был склонирован репозитой.

Если все хорошо, то вы должны увидеть на экране строку:

listening on localhost:3000

После этого запустите браузер и в новой вкладке перейдите по адресу localhost:3000. Наберите любое сообщение в строке ввода и нажмите Enter. Как видите, все работает и вы можете прочитать это сообщение также и в терминале. В том регионе, где выполняли команду node index.js.

example tmux with node.js, socket.io, mc

А теперь пришло время сделать то, что мы делали и в предыдущей статье. Сымитируем обрыв связи. Нужно закрыть терминал через крестик. Но при этом не закрывайте браузер. И попробуйте отправить еще несколько сообщений. Все продолжает работать. Это при том, что мы только что закрыли терминал.

example tmux. Chat is still working

Сессию и все процессы, которые были запущены tmux сохранил. Как мы знаем из предыдущей статьи, screen тоже умеет так делать. Давайте подключимся обратно к сессии tmux. Запустите терминал и выполните команду:

tmux attach

example tmux. tmux attach

Как вы могли заметить, тот layout, который мы создавали раньше (разбивку панелей по вертикали), tmux сохранил. Это огромный плюс по сравнению с тем же screen’ом.

Полезные ссылки


  1. Хорошая шпаргалка по tmux
  2. Хорошая шпаргалка по tmux (habr версия)
  3. Официальный сайт tmux
  4. man tmux =)

screen vs. tmux


Пришло время сравнить screen и tmux. За время работы и со screen’ом, и c tmux’ом (примерно 2,5 года) я пришел к выводу, что screen’ом если и стоит пользоваться, то только в том случае, если вам недоступен tmux. Т.е. если вы не можете установить себе tmux или собрать его из исходников. Во всех остальных случаях лучше сразу начинать с tmux’а.
screen tmux
- Не умеет создавать layout для каждой вкладки
- Не умеет сохранять layout, если оборвалась связь или еще что-то там
- До версии 4.1 не умел делать разбивку по вертикали
- Когда вы создали новый регион, то в нем отдельно нужно создать новое окно (Ctrl+a, c), выполнить переход в нужную директорию и т.д.
- Чтобы удалить регион тоже нужно помучатся Ctrl+a, :remove
+ «с коробки» настроен довольно качественно
+ Не нужно настраивать положение панели с вкладками, как их подсвечивать
+ Умеет делить экран на панели, как по вертикали, так и по горизонтали
+ Чтобы закрыть панель, достаточно набрать exit
+ Умеет держать удаленное соединение*

* нужна дополнительная магия

Давайте подытожим. Мы рассмотрели еще один из менеджеров терминалов, а именно tmux. Попрактиковались в установке, настройке. Использовали некоторые горячие клавиши. Попробовали tmux на примере. Увидели его преимущества по сравнению с тем же screen’ом.

Кроме screen и tmux есть довольно широкий выбор менеджеров терминалов для разных ОС, ваши личные предпочтения и пожелания.

На этом все. Спасибо за внимание. Кто дочитал до конца, отдельное спасибо. До встречи в следующей статье.
Поделиться с друзьями
-->

Комментарии (38)


  1. vlsinitsyn
    26.12.2016 13:09

    "… А в том регионе, что справа, запустим наше тестовое приложение."
    А как перейти в тот регион, что справа, вы не сказали.


    1. var_bin
      26.12.2016 13:10

      Добрый день.


      Спасибо, поправил.


  1. wladyspb
    26.12.2016 14:48
    +1

    Здравствуйте, благодаря вашей первой статье узнал о терминальных менеджерах и начал использовать tmux.
    Хотелось узнать момент, который я не нашёл нигде — есть ли возможность сохранить пресет сессии при выключении компьютера? Допустим, мне не важно чтобы в каждой вкладке были уже запущены процессы, хочется именно восстановить после выключения компьютера такие вещи как количество вкладок, их лэйауты и пути — например в первой вкладке у меня home, во второй — папки репозитория и деплоя определённого проекта разделённые по вертикали, в третьей — папка логов.


    1. var_bin
      26.12.2016 15:11

      Добрый день, Владимир!


      Спасибо за вопрос. Довольно интересная задача. Читал в одной статье про решение вашего вопроса. Ссылку на статью не могу найти. Но вот решения я себе сохранил. Есть два инстумента: раз, два. Для старта, попробуйте их. Плюс, вот здесь было живое обсуждение такой же проблемы. Есть примеры простых скриптов. Отпишитесь про результаты )


      1. wladyspb
        26.12.2016 15:28

        Спасибо, по ссылочкам погулял, странно что не наткнулся раньше) Постараюсь отписаться сюда, как протестирую)


      1. wladyspb
        26.12.2016 16:33
        +2

        Изучил немного tmuxinator, достаточно удобный инструмент. Вкупе с небольшими хаками в .bashrc теперь у меня в любой момент при запуске консоли запускается уже проинициализированная сессия tmux, в конфиг tmuxinator можно прописывать любые команды на выполнение для каждого окна, так что не проблема даже настроить чтобы автоматом подключался по ssh при первом запуске, или даже очередь команд, например подключиться по ssh + перейти в нужную директорию + открыть лог.


        1. var_bin
          26.12.2016 17:44

          Ухты, крутяк!


          Поздравляю )


    1. typ6o0jiehb
      27.12.2016 10:42

      Я использую retmux (https://github.com/sk1418/retmux, https://aur.archlinux.org/packages/retmux/)
      Очень рекомендую посмотреть.


    1. banzayats
      27.12.2016 14:01

      С недавних пор использую tmux-resurrect. Он как раз сохраняет такие вещи как количество вкладок, их названия, области и пути.


  1. athost
    26.12.2016 15:04
    +1

    В Ubuntu есть удобная оболочка для screen и tmux — byobu


    1. var_bin
      26.12.2016 15:20

      Добрый день, Алексей!


      Да, вы правы, есть такая. Но если у пользователя нет опыта работы ни со screen'ом ни с tmux'ом, то я бы советовал не пробовать никакие оболочки. А начать с "голого" screen'а или tmux'a. А то и так будет много магии, а с оболочками ее будет еще больше. Все, что происходит внутри будет понять сложно.


      1. CynepHy6
        26.12.2016 16:03

        не согласен. Если пользователю надо «работать» сейчас, а не «изучать» — то byobu отличный выбор. пару минут посмотреть и можно спокойно работать. А потом, если будет нужно — можно и глубже лезть.


        1. var_bin
          26.12.2016 16:10

          Добрый день.


          А что вы подразумеваете под «изучать»? Если пользователь знает про screen или tmux, то он как минимум, понимает зачем они и прочитал пару статтей. В свою очередь, чтобы пользоваться byobu, то о нем нужно: знать, что это и зачем; выполнить отдельную установку; запомнить все сочетания клавиш, которые в корне отличаются от сочетаний для screen и tmux. Плюс ко всему, любая обертка накладывает свои ограничения, как в пользовании так и в производительности. Это тоже нужно учитывать. И что самое важное, у вас могут быть права на устрановку screen или tmux, а на установку byobu могут обрезать.


          1. CynepHy6
            26.12.2016 20:26

            под изучать я понимаю «как минимум прочитал пару статтей»
            для бюобу достаточно нажать ф1, не надо запоминать все — что надо само отложится


    1. Termux
      27.12.2016 10:41

      Или guake — это написанный на python эмулятор терминала
      с возможностями tilda (quake-style)
      и консолями-вкладками.


      1. strelkan
        29.12.2016 08:26

        отличная штука, кстати, и под венду есть аналог — ConEmu


        1. Termux
          29.12.2016 09:13

          лучше cmder
          это ConEmu + clink (автодополнение/автозавершение)
          +настройки


  1. DCS
    26.12.2016 16:11

    Добрый день Алексей,

    не подскажите как можно организовать прокрутку в окне tmux, никак не могу победить данный вопрос.
    Спасибо


    1. grSereger
      26.12.2016 16:31

      Хорошая шпаргалка по tmux (habr версия)

      Ctrl+b PgUp — вход в «режим копирования», после чего:
      PgUp, PgDown — скроллинг;
      q — выход из «режима копирования».


  1. Akon32
    26.12.2016 17:04

    Сочетание Ctrl+b в tmux, имхо, неудобное для пальцев.
    Несложно заменить его на Ctrl+a, добавив в /etc/tmux.conf строки


    unbind C-b
    set -g prefix C-a
    bind C-a send-prefix


    1. Erelecano
      26.12.2016 21:55
      +1

      Очень плохая идея. C-b сделано специально, что бы не пересекалось с C-a у screen. Я вот использую у себя на точке откуда делаю ssh к клиентам tmux и там C-b, а на клиентских серверах порой screen, где C-a, что бы не путаться.
      И C-b вполне удобен.


      1. maydjin
        27.12.2016 10:55

        C-b сделано что бы не пересекаться с C-a у bash.


        А точнее у всех приложений основанных на libreadline.


        1. Akon32
          27.12.2016 11:43

          Но в bash есть и C-b.


          В tmux можно нажать C-a дважды, чтобы послать одиночный C-a программе. Со screen конечно неудобно будет, но в bash'е — приемлемо.


          1. maydjin
            27.12.2016 22:10

            Ого, круто, не знал: ни про C-b в bash (однако, не так оно востребовано как C-a или meta-b например) ни про C-a дважды.


      1. EvilShadow
        27.12.2016 20:03

        Оба плохи. В стандартном емакс-подобном режиме, т.е. в дефолтном режиме оболочек (как bash, так и zsh) `ctrl+a` — переход в начало строки, а `ctrl+b` — на один символ назад.


        1. Erelecano
          27.12.2016 20:09
          -2

          20 лет администрирую никсы, 20 лет не использую в bash/zsh и ко ctrl+a или ctrl+b. В начало строки я возвращаюсь чудесным образом кнопкой Home, на один символ назад я думаю угадаете как.
          Использование emacs-режима может быть интересно только существам с 17 щупальцами, которые могут использовать и сам emacs, а я — классический гуманоид, у меня две руки на которых по пять пальцев.

          А вот непересечение со screen для меня критично, потому как использую screen внутри tmux'а ежедневно.


          1. EvilShadow
            29.12.2016 18:35

            > 20 лет администрирую никсы, 20 лет не использую в bash/zsh и ко ctrl+a или ctrl+b. В начало строки я возвращаюсь чудесным образом кнопкой Home, на один символ назад я думаю угадаете как.
            Искренне за Вас рад.
            > Использование emacs-режима может быть интересно только существам с 17 щупальцами, которые могут использовать и сам emacs, а я — классический гуманоид, у меня две руки на которых по пять пальцев.
            Т.е. Вы ничего не знаете о emacs.


            1. Erelecano
              29.12.2016 20:21
              -3

              > Т.е. Вы ничего не знаете о emacs.

              Вы смешное, не знаете стандартных шуток об операционной среде Emacs, в которой нет текстового редактора.


  1. Jedi-Knight
    26.12.2016 21:36
    -3

    я всегда думал, что переход на светлую сторону сопряжён с уходом от кривущей, богомерзкой ubuntu… холивар хэс бин стартед…


  1. vlsinitsyn
    27.12.2016 00:26

    Мышь перестала работать в mc если запускать под tmux. Можно как-то поправить?


    1. Keramblock
      27.12.2016 10:43

      Возможно:
      set-option -g mouse on в ~/.tmux.conf
      Вам поможет?


      1. vlsinitsyn
        27.12.2016 12:44

        не, не помогает. Я как и автор использую Putty в качестве клиента. Все мышиные действия перестают работать, копипаст и т.д…



  1. iilin
    27.12.2016 01:03

    Подскажите, никто не задавался вопросом запуска tmux на удаленно сервере, когда локально уже запущен tmux. Собственно интересен вопрос как выставить приоритет клавиш, или просто нужно делать биндинг на разные сочетания?


    1. iilin
      27.12.2016 01:04

      Просто на скрине в начале статьи, как мне кажется так и сделано, интересно как правильно это настроить?


      1. var_bin
        27.12.2016 11:29

        Добрый день.


        На ваш вопрос, dronmaxman ответил в своем комментарии.


  1. dronmaxman
    27.12.2016 10:41
    +1

    Вот уже 5 лет юзаю tmux+mosh и не могу нарадоваться!

    Хочу поделиться парочкой хаков в своей работе. Работаю на ноутбуке, авторизуюсь по ключу. Подключаюсь к рабочему ПК на линухе в локальной сети, на пограничнике проброшены порт ssh и mosh на это ПК. Соответственно всегда подключаюсь через белый адрес пограничника и уже не важно где я нахожусь, в локальной сети или во внешней, подключаю к разным беспроводным точкам, к мобильному интернету — mosh всегда держит мою сессию с открытым tmux!!!

    На рабочем ПК переключение в tmux ctrl+b на всех остальный серверах ctrl+f — как следствие, могу спокойно открывать tmux в tmux. Добавил в ~/.tmux.conf, теперь при открытии «tmux a» стразу в 0 окне открывается логи сервака, а в первом лог апача или чего-то еще.

    new -n "[LOGS]" "sudo multitail -f /var/log/messages  -f /var/log/daemon.log -f /var/log/auth.log"
    setw window-status-bg yellow
    setw window-status-fg black
    setw window-status-attr dim
    new -n "[APACHE2]" "sudo multitail -f /var/log/apache2/access.log -f  /var/log/apache2/error.log"
    setw window-status-bg yellow
    
    


    Еще есть маленький хак, окна в tmux сами меняют заголовки в зависимости от приложения которое в них запущено
    vim /etc/tmux.conf
    set -g status-left "#[fg=yellow,bold,bg=black] #H #[default]#[fg=white,bg=black] #P #[default]#[fg=white,bold]["
    set -g status-right "#[fg=white,bold]]#[fg=yellow,bold,bg=black] #(whoami) #[default]"
    
    

    Так же можно менять цвет панель tmux в зависимости от важности сервиса (красный — продакшен, синий — тестовый и т.д.)

    Для наглядности.
    http://dropmefiles.com/0Uy7b


    1. var_bin
      27.12.2016 11:21

      Добрый день.


      Спасибо за ваш подробный и полезный комментарий.


      Для наглядности.
      http://dropmefiles.com/0Uy7b

      Ссылка битая (