Как запустить два сеанса tmux с разными средами?

Наивный способ сделать это не работает. Попробуй это:

Запустите первую сессию tmux.

$ export ENVIRONMENT="production"
$ tmux

Затем вы можете убедиться, что внутри сеанса ENVIRONMENT есть production

Затем во втором терминале запустите еще одну сессию

$ export ENVIRONMENT="staging"
$ tmux

Удивительно, но в этом сеансе ENVIRONMENT тоже production! Это очень неинтуитивно!

Что здесь происходит? Как я могу этого добиться? Мне нравится, чтобы все окна в сеансе «наследовали» переменную ENVIRONMENT.


person smatting    schedule 24.05.2018    source источник
comment
Быстрый ответ заключается в том, что каждый процесс в новом сеансе наследует свою среду от сервера, который создает сеанс, а не от среды команды, которая создает сеанс. Ваш первый tmux запускает сервер; ваш второй использует существующий сервер.   -  person chepner    schedule 24.05.2018


Ответы (3)


«Самое простое» решение — создать новый tmux сервер с другой средой.

$ ENVIRONMENT=production tmux -L prod-tmux

и

$ ENVIRONMENT=staging tmux -L staging-tmux

Вам всегда нужно указать, какой сокет, prod-tmux или staging-tmux, использовать всякий раз, когда вы повторно подключаетесь к существующему сеансу.


Следующим решением будет использование одного сервера, но изменение среды каждого сеанса на этом сервере. Что-то вроде

$ tmux new-session -d -s production
$ tmux new-session -d -s staging
$ tmux set-environment -t production ENVIRONMENT production
$ tmux set-environment -t staging ENVIRONMENT staging

Обратите внимание, что ENVIRONMENT не будет установлено в процессе, работающем в начальном окне для каждого сеанса, но будет установлено для любого последующего создаваемого окна. (Если только сервер не унаследовал ENVIRONMENT при первом запуске.)


Когда вы запускаете tmux, он сначала ищет существующий сервер (либо сервер по умолчанию, либо тот, который указан параметрами -L или -S). Если сервера нет, он запускается, и среда сервера наследуется от текущей среды.

Если сервер существует, tmux просто запрашивает сервер выполнить команду tmux (по умолчанию new-session или любую другую команду, указанную в аргументе tmux), а затем завершает работу. Окружение самой команды tmux не имеет значения, если запрошенная команда не задокументирована для чтения из нее (см. set-environment).

Сервер управляет группой окон, каждое из которых представляет процесс, созданный сервером (а не саму команду tmux). Сеанс — это просто логическая группа окон, также управляемая сервером.

person chepner    schedule 24.05.2018
comment
Это замечательный ответ. Я не совсем уверен, почему это не получило большей известности. Мне потребовалось, чтобы я начал писать новый вопрос, прежде чем предложение появилось в результатах поиска. - person jodag; 18.11.2019

Основываясь на отличном ответе @chepner, мы можем решить эту проблему, добавив псевдонимы для определения разных команд tmux для разных серверов. Например, мы можем добавить следующее к ~/.bashrc.

# somewhere in ~/.bashrc
alias tmux-s1='tmux -L s1'
alias tmux-s2='tmux -L s2'
alias tmux-s3='tmux -L s3'
alias tmux-s4='tmux -L s4'
alias tmux-s5='tmux -L s5'

Теперь мы можем использовать tmux-s1, tmux-s2 и т. д. так же, как мы обычно используем команду tmux, за исключением того, что каждый вариант будет связан с другим сервером. Когда мы создаем сеанс для сервера, у которого нет активных сеансов, для инициализации сервера будут использоваться текущие переменные среды. Для повторного подключения к сеансу нам потребуется псевдоним сервера, на котором был создан сеанс.

Пример

$ export ENVIRONMENT="production"
$ tmux-s1 ls
no server running on /tmp/tmux-12345/s1
$ tmux-s1
############### now attached to session 0 on server s1 ################
$ echo $ENVIRONMENT
production
################### (ctrl+b,d) detach from session ####################
[detached (from session 0)]
$ tmux-s1 ls
0: 1 windows (created Sun Nov 17 18:13:18 2019) [80x20]

$ export ENVIRONMENT="staging"
$ tmux-s2 ls
no server running on /tmp/tmux-12345/s2
$ tmux-s2
############### now attached to session 0 on server s2 ################
$ echo $ENVIRONMENT
staging
################### (ctrl+b,d) detach from session ####################
[detached (from session 0)]
$ tmux-s2 ls
0: 1 windows (created Sun Nov 17 18:13:22 2019) [80x20]
person jodag    schedule 17.11.2019

Более новые версии tmux, кажется, изначально поддерживают это! Я поддерживаю devops для нескольких клиентов и хотел установить отдельный файл истории bash для каждого клиента. Следующее работает очень хорошо для меня! Он устанавливает рабочий каталог в каталог клиента/проекта и устанавливает путь к файлу истории bash.

tmux new -c ~/Documents/code/CLIENT/ -e HISTFILE=~/Documents/code/CLIENT/.bash_history -s CLIENT -d
person kim0    schedule 06.06.2021