151

I am trying to figure out how to attach to a tmux session if a named tmux session exists, if not I want to create a new one with the given name.

Currently, I know of a few tmux commands which can partly achieve what I am looking for, but its not clear how to combine them together to get what I am looking for:

  • tmux attach attaches to an automatically existing session - but errors out if no session exists
  • tmux new creates a new session - but it does so every time, so I can't leave it in my .tmux.conf
  • tmux has-session tests whether a session exists - but I don't know how to stitch it together with the other commands

Thus, I would like to create a tmux script, so that this happens automatically, instead of having to manually create it everytime I need to log into a sessions.

How can I write a automatic script so as to create a new tmux session (if a given session name doesnt exist) or attach to a session name (if it exists)?

alpha_989
  • 4,451
  • 1
  • 33
  • 46
rampion
  • 84,670
  • 47
  • 191
  • 309
  • 15
    @kzh: I view it as a programming tool question, like vim – rampion Jan 21 '11 at 18:46
  • 6
    I have written another possible answer for this question as a gist, in case anyone's interested: https://gist.github.com/chakrit/5004006 – chakrit Feb 21 '13 at 11:22
  • 10
    Meanwhile, my `man tmux` says: "The -A flag makes new-session behave like attach-session if session-name already exists" – Petr Viktorin Nov 18 '13 at 13:13
  • 1
    For those flagging to move this, I should note that even moderators cannot migrate questions more than 60 days old to another site. The reasons for this system limit are explained [here](http://meta.stackexchange.com/questions/151890/disable-migration-for-questions-older-than-60-days). – Brad Larson Feb 21 '17 at 03:22
  • https://gist.github.com/MohamedAlaa/2961058 find list of all commands – ULLAS K Mar 16 '17 at 18:31
  • 1
    @BradLarson, currently, the best/simplest option to do this is answered in a comment, way down: https://stackoverflow.com/questions/3432536/create-session-if-none-exists#comment74258862_7799360. Most users who come here wont be able to find this. This is obviously a very important question as you can see by the number of votes. Is it possible to open this question, so I can add that as an answer, so new people can find this? – alpha_989 Mar 06 '18 at 13:33
  • @alpha_989 - I've reopened it. Feel free to leave a new answer. – Brad Larson Mar 06 '18 at 15:11
  • 1
    related: https://unix.stackexchange.com/questions/103898/how-to-start-tmux-with-attach-if-a-session-exists – Ciro Santilli Путлер Капут 六四事 Apr 03 '19 at 14:25

7 Answers7

168

I figured it out (and had it pointed out to me).

tmux attach || tmux new
rampion
  • 84,670
  • 47
  • 191
  • 309
  • 29
    This answer works better for me because I can name the session: `tmux attach-session -t my-session || tmux new-session -s my-session`. The only problem is this is not atomic. tmux really ought to have a create-or-attach command. – Andrew May 11 '12 at 20:19
  • 5
    I have next alias in bash - `alias tm='tmux attach || tmux new'` – azat Apr 17 '13 at 19:51
  • 10
    Upvoting because with a small tweak this works with named sessions: `tmux attach -t some_name || tmux new -s some_name`. Change some_name to $1 add a shebang, and save. – Cheezmeister Jan 09 '14 at 04:48
  • @RandalSchwartz, yes - why `new-session` is better? – anatoly techtonik Feb 05 '14 at 13:00
  • I think both answers are good for different use cases. I modified this to not output any error messages with attach: `(tmux has &>/dev/null) && tmux attach || tmux new`. I currently use both answers in different environments. – daboross May 11 '14 at 18:41
  • 11
    Note to those unfamiliar with tmux and wondering about `new` vs `new-session`: they are synonyms, and so are `attach` and `attach-session`. – Esteis Jul 24 '15 at 08:38
  • 1
    `tmux new-session -ds default \; split-window -dv 2>/dev/null; tmux attach -t default` works far better and does not open a second tmux in case you `/bin/kill` the first one. The only downside is that you need to name the sessions for this. – Tino May 25 '16 at 16:05
  • @rampion, the link doesnt seem to be working.. also a better solution maybe available here: https://stackoverflow.com/questions/3432536/how-to-create-new-tmux-session-if-none-exists?noredirect=1#comment74258862_7799360 – alpha_989 Mar 06 '18 at 15:55
  • Someone who met a unexpected error to run this command with tmux 3.2 can try `tmux a || true && tmtux n`, which is more robust. – Chang Ye Jul 18 '20 at 15:55
90

Alternately, you can add

new-session

to your .tmux.conf - that will create a default session on server start.

Then tmux attach will either attach to the current session (running server, that is), or create a new session (start the server, read the config file, issue the new-session command) and attach to that.

Leonid Shevtsov
  • 13,666
  • 9
  • 49
  • 82
88

As pointed out in comments from Petr Viktorin, jkoelker and pjincz, you can use the following command to attach to mySession if it exists, and to create it if it doesn't:

 tmux new -A -s mySession

From man tmux:

new-session[-AdDEP] [-cstart-directory] [-Fformat] [-nwindow-name] [-ssession-name] [-tgroup-name] [-xwidth] [-yheight] [shell-command]

(alias: new)

Create a new session with name session-name.

[...]

The -A flag makes new-session behave like attach-session if session-name already exists; in this case, -D behaves like -d to attach-session.

new-session has supported -A since tmux-1.8.

rampion
  • 84,670
  • 47
  • 191
  • 309
alpha_989
  • 4,451
  • 1
  • 33
  • 46
  • 1
    If you are going to use this in something like `gnome-terminal` as the command I'd suggest leaving off the `-s` and the specific session name so you don't end up with EVERY new `gnome-terminal` session attached to the same session. You can always select an existing session with `prefix + s` after opening a new terminal. – dragon788 Jul 04 '18 at 03:58
15

Adapting Alex's suggestion to include project based configuration upon startup, I started using the following:

# ~/bin/tmux-myproject shell script
# The Project name is also used as a session name (usually shorter)
PROJECT_NAME="myproject"
PROJECT_DIR="~/myproject"

tmux has-session -t $PROJECT_NAME 2>/dev/null
if [ "$?" -eq 1 ] ; then
    echo "No Session found.  Creating and configuring."
    pushd $PROJECT_DIR
    tmux new-session -d -s $PROJECT_NAME
    tmux source-file ~/bin/tmux-${PROJECT_NAME}.conf
    popd
else
    echo "Session found.  Connecting."
fi
tmux attach-session -t $PROJECT_NAME

where tmux-myproject.conf is my startup series of tmux commands to create my windows and panes, as well as start my editors.

Anm
  • 3,179
  • 2
  • 27
  • 38
14

Although I find rampion's answer is sufficient for using 1 session, this script lets you setup multiple sessions:

SESSIONS="work play"

function has-session {
    tmux has-session -t $1 2>/dev/null
}

function except 
{
    if [ "$?" -eq 1 ] ; then
        $1
    fi
}

# Configure your sessions here
function session-work
{
    tmux new-session -d -s work
    tmux neww -k -t work:1
}

function session-play
{
    tmux new-session -d -s play
    tmux neww -k -t play:1
}

#
#MAIN 
for x in $SESSIONS
do
    echo $x
    has-session $x
    except session-$x
done

NOTE:

-k  --> new-window will not be created if already exists
-d  --> start session or window, but don't attach to it yet
-s  --> name the session
-t  --> specify a target location in the form session:window.pane 
Alex Gaudio
  • 1,824
  • 16
  • 11
9

I use an alias to create a new session if needed, and attach to my default session if it already exists:

alias tmuxre='tmux new-session -t default || tmux new-session -s default'

I added this to my .login on my server.

The reason I do it this way is because I don't want to attach to the same actual session, I want a new session which uses the same group of windows.

This is also similar to running screen -xRR.

Dakusan
  • 6,295
  • 4
  • 31
  • 43
Michael
  • 726
  • 6
  • 12
  • 2
    If you are in and out of your session often, this leaves lots of unused sessions, as seen by `tmux list-sessions`. – Anm Aug 16 '12 at 19:09
  • Yeah, it does, I just clean them up every now and then. It's a minor drawback to get the functionality I want. – Michael Aug 23 '12 at 21:49
  • Hey @mateusz-piotrowski - I agree with the edit to wrap my code in a code block but why would you edit the other text to be different than what I said? Sorry to comment here but I didn't see anywhere else to. – Michael Jan 25 '16 at 23:02
  • I didn't mean to offend you. I just thought you couldn't _run_ an alias _in_ a config file and so it must have been a typo. – Mateusz Piotrowski Jan 25 '16 at 23:08
  • Proper grammar/phrasing or not, I would hope that if user content is going to be edited on this site, there is some discussion with the user involved, as it seems very heavy-handed and easy to abuse otherwise. I didn't see any way to participate in this process myself, you just arbitrarily decided what I must have meant and changed what I said without bothering to ask for clarification. – Michael Jan 26 '16 at 21:39
  • 3
    By now, you can just type: `tmux new -A -s default` to launch a new session if it is not exist or attach automatically. I think it's much better than editing config file. – pjincz Apr 25 '17 at 07:56
  • @pjincz - that doesn't do what I wanted. That just makes a single session, whereas I wanted multiple sessions connected to the same window set. – Michael Apr 25 '17 at 21:12
2

For those who want to do the same thing in fish:

tmux attach -t mysesh; or tmux new -s mysesh
tinyspark
  • 51
  • 3