smatting
smatting

Reputation: 137

How to start two tmux sessions with different environments?

The naive way to do this is not working. Try this:

Start a first tmux session.

$ export ENVIRONMENT="production"
$ tmux

You can then verify that inside the session ENVIRONMENT is production

Then, in a second terminal start another session

$ export ENVIRONMENT="staging"
$ tmux

Surprisingly in this session ENVIRONMENT is also production! This is very unintuitive!

What is going on here? How can I achive this? I like all windows in a session to "inherit" the ENVIRONMENT variable.

Upvotes: 7

Views: 2795

Answers (3)

kim0
kim0

Reputation: 291

Newer versions of tmux seem to support this natively! I do devops support for multiple clients and wanted to set a separate bash history file for each client. The following works very well for me! It sets the working directory, to the client/project dir, and sets the bash history file path

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

Upvotes: 2

jodag
jodag

Reputation: 22294

Based on the excellent answer by @chepner we can solve this issue by adding aliases to define different tmux commands for different servers. For example we could append the following to ~/.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'

Now we can use tmux-s1, tmux-s2, etc... the same way we would normally use the tmux command except each variant will be associated with a different server. When we create a session for a server that has no active sessions then the current environment variables will be used to initialize the server. To reattach to the session we will need the alias for the server that the session was created with.

Example

$ 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]

Upvotes: 1

chepner
chepner

Reputation: 532238

The "simplest" solution is to create a new tmux server with the different environment.

$ ENVIRONMENT=production tmux -L prod-tmux

and

$ ENVIRONMENT=staging tmux -L staging-tmux

You'll always need to specify which socket, prod-tmux or staging-tmux, to use whenever you reconnect to an existing session.


The next solution would be to use one server, but modify the environment of each session in that server. Something like

$ 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

Note that ENVIRONMENT would not be set in the process running in the initial window for each session, but will be for any subsequent window created. (Unless the server inherited ENVIRONMENT when it first started.)


When you run tmux, it first looks for an existing server (either the default server, or the one specified by either the -L or -S options). If there is no server, one is started, and the server's environment is inherited from the current environment.

If there is a server, tmux simply requests the server to execute a tmux command (by default, new-session, or whatever command is specified by an argument to tmux) command, then exits. The environment of the tmux command itself isn't relevant, unless the requested command is documented to read from it (cf. set-environment).

The server manages a group of windows, each of which represents a process created by the server (not the tmux command itself). A session is just a logical group of windows, also managed by the server.

Upvotes: 10

Related Questions