Linux – Launching tmux using gnome-terminal

linuxterminaltmuxUbuntu

I'm a little confuse regarding how one launches tmux. When I launch my terminal (current gnome-terminal), I would like to have tmux up and running.

I'm currently doing this by calling "tmux" in my .zshenv (kind of like .bashrc in bash). This does in fact launch tmux, but has some annoying side effects. First, hitting Ctrl-D to exit the shell, only kills tmux, and leaves the tmux-less gnome-terminal still running. An additional Ctrl-D will kill that as well. Second, when ssh into a box with this setup, I get a second, nested instance of tmux. I don't want tmux to launch again when I ssh.

Is this the right approach, how should tmux be launched usually?

Best Answer

Launching anything from .zshenv is definitely the wrong approach. This file is executed by every instance of zsh, even when running a script. Use .zshrc for things that should be done in interactive shells, and .profile (or .zprofile, if you've set zsh as your login shell) for things that should be done when you log in.

If you want tmux in every terminal, start tmux directly under the terminal, e.g., gnome-terminal -e tmux (change your GUI launcher to pass these arguments). You can pass arguments even with -e (though be careful with quoting), e.g. gnome-termminal -e 'tmux -s ~/.alternate.tmux.conf'.

If you also want to start tmux when you log in over ssh, you'll have to launch it from your ~/.profile. Do this only if the parent process of the login shell is sshd:

parent_process_name=$(ps -o comm= -p $PPID`)
case ${parent_process_name##*/} in
  sshd) type tmux >/dev/null 2>/dev/null && exec tmux;;
esac

Another approach to starting tmux over ssh would be to obtain a session name from the environment. That way you could attach to an existing session. The easiest way is to write a small script on the server side, e.g. ~/bin/tmux-login-session:

#!/bin/sh
if tmux has-session -t "$1"; then
  exec tmux attach-session -t "$1"
else
  . ~/.profile
  exec tmux new-session -s "$1"
fi

Then use an ssh command like the following:

ssh -t hostname.example.com bin/tmux-login-session SESSION_NAME
Related Question