Запустите сеанс tmux и убедитесь, что все дочерние процессы завершены

Запустите сеанс tmux и убедитесь, что все дочерние процессы завершены

Я использую tmux для разработки, у меня одна задача запущена в окне, а другая — в своем собственном. Я установил соглашение, что базовое имя каталога проекта — это имя сеанса tmux.

export SESSION_NAME="my-project-name"
tmux kill-session -t "$SESSION_NAME"
tmux new-session -s "$SESSION_NAME" \
                "api.start --monitored" \; \
                split-window "ui.start --monitored" \; \
                select-layout tiled \; \
                set-option -w remain-on-exit on \; \
                set-option -w mouse on \; \
                set-option -g mouse on \; \
                bind-key -n C-c kill-session -t "$SESSION_NAME"

Кажется, все работает правильно, за исключением того, что при запуске другого проекта с тем же соглашением сочетание клавиш CTRL+c в первом сеансе каким-то образом считает, что SESSION_NAME — это один из последних сеансов, созданных tmux, а это не то, на что я надеялся.

решение1

В опубликованном вами фрагменте каждое появление $SESSION_NAMEраскрывается оболочкой, и каждое tmuxразвернутое значение получает в качестве аргумента командной строки.

(Даже если это не так и вы хотите расширить это $SESSION_NAMEпозже внутри tmux или внутри оболочки внутри tmux, ваши усилия export SESSION_NAME="my-project-name"могут оказаться бесполезными из-закак tmuxстроится окружающая среда. update-environmentОпция или new-session -e …команда могут быть полезны.)

Это включает $SESSION_NAMEв себя bind-key -n C-c kill-session -t "$SESSION_NAME". Ваши tmuxвыполнения:

bind-key -n C-c kill-session -t my-project-name

Тогда для другого проекта команда tmux будет выглядеть так:

bind-key -n C-c kill-session -t different-name

Важно то, что bind-keyсамо по себе не нацелено на один сеанс. bind-key -n C-c …изменяет поведение Ctrl+ cдля всего сервера tmux. В вашем случае последнее bind-keyперезаписывает предыдущее назначение, а затем Ctrl+ cв любом сеансе будет kill-session -t different-name.

Я думаю, вы могли бы использовать key-tableопцию, чтобы задать таблицу ключей по умолчанию на что-то другое, чем root, отдельно для каждого сеанса. В каждой новой таблице ключей вы могли бы задать другую привязку для C-c. Я не проверял это, ядуматьэто может быть возможно.

Если бы я был вами, я бы сделал проще. Я бы сделал так:

tmux bind-key -n C-c kill-session

kill-sessionбез -tцелейтекущийсеанс, поэтому эта привязка должна делать то, что вам нужно для my-project-nameили different-nameлюбого другого сеанса.

Честно говоря, "любая другая сессия" для меня слишком. Я бы не хотел Ctrl+ cубивать все в своемобщее назначениесеанс(ы). Я бы решил это:

  • либо оставить C-cвсе как есть и выбрать другое нажатие клавиши в качестве «глобального SIGINT», а затем преднамеренно использовать одно или другое;

  • или явно "отмечая" сеансы, которые должны использовать Ctrl+ cкак "глобальный SIGINT". Это может быть что-то вроде этого:

    tmux new-session -e 'TMUX_GLOBAL_SIGINT=1' \; \
          bind-key -n C-c if-shell '[ -n "$TMUX_GLOBAL_SIGINT" ]' kill-session 'send-keys C-c'
    

    Теперь в каждой сессии, TMUX_GLOBAL_SIGINTв окружении которой есть непустая переменная Ctrl+ cубьет сессию. В каждой сессии, где TMUX_GLOBAL_SIGINTпусто или не установлено Ctrl+ cбудет работать как обычно.

    Примечания:

    • Для уже начатого сеанса вы можете изменить настройки с помощью tmux set-environment -u TMUX_GLOBAL_SIGINTили tmux set-environment TMUX_GLOBAL_SIGINT 1(используйте -tдля выбора конкретного сеанса, не обязательно текущего).

    • Оболочка (или другая программа), запущенная в tmux, может наследовать TMUX_GLOBAL_SIGINT. Если она запускается tmux new-session …, то (в зависимости от update-environmentи т. п.) новый сеанс также может наследовать переменную, даже без явного -e 'TMUX_GLOBAL_SIGINT=1'. Прочитайте man 1 tmuxи узнайте, как tmux управляет средой.

Связанный контент