How to create new tmux session if none exists

74,806

Solution 1

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.

Solution 2

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

tmux attach || tmux new

Solution 3

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.

Solution 4

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.

Solution 5

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 
Share:
74,806

Related videos on Youtube

rampion
Author by

rampion

Mathematician, programmer, and researcher; with interests in algorithmic design, software engineering theory, and massively parallel computing. I'm also a keyboard junkie and an aspiring language nerd.

Updated on April 21, 2022

Comments

  • rampion
    rampion about 1 month

    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)?

    • rampion
      rampion over 11 years
      @kzh: I view it as a programming tool question, like vim
    • chakrit
      chakrit about 9 years
      I have written another possible answer for this question as a gist, in case anyone's interested: gist.github.com/chakrit/5004006
    • Petr Viktorin
      Petr Viktorin over 8 years
      Meanwhile, my man tmux says: "The -A flag makes new-session behave like attach-session if session-name already exists"
    • alpha_989
      alpha_989 about 4 years
      @BradLarson, currently, the best/simplest option to do this is answered in a comment, way down: stackoverflow.com/questions/3432536/…. 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?
    • Ciro Santilli Путлер Капут 六四事
      Ciro Santilli Путлер Капут 六四事 about 3 years
  • Andrew
    Andrew about 10 years
    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.
  • Anm
    Anm almost 10 years
    If you are in and out of your session often, this leaves lots of unused sessions, as seen by tmux list-sessions.
  • Michael
    Michael over 9 years
    Yeah, it does, I just clean them up every now and then. It's a minor drawback to get the functionality I want.
  • azat
    azat about 9 years
    I have next alias in bash - alias tm='tmux attach || tmux new'
  • Cheezmeister
    Cheezmeister over 8 years
    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.
  • anatoly techtonik
    anatoly techtonik over 8 years
    @RandalSchwartz, yes - why new-session is better?
  • daboross
    daboross about 8 years
    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.
  • Esteis
    Esteis almost 7 years
    Note to those unfamiliar with tmux and wondering about new vs new-session: they are synonyms, and so are attach and attach-session.
  • Michael
    Michael over 6 years
    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.
  • Mateusz Piotrowski
    Mateusz Piotrowski over 6 years
    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.
  • Michael
    Michael over 6 years
    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.
  • Tino
    Tino almost 6 years
    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.
  • pjincz
    pjincz about 5 years
    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.
  • Michael
    Michael about 5 years
    @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.
  • alpha_989
    alpha_989 about 4 years
    @rampion, the link doesnt seem to be working.. also a better solution maybe available here: stackoverflow.com/questions/3432536/…
  • dragon788
    dragon788 almost 4 years
    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.
  • Chang Ye
    Chang Ye almost 2 years
    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.