How to create new tmux session if none exists
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
-Aflag makesnew-sessionbehave likeattach-sessionifsession-namealready exists; in this case,-Dbehaves like-dtoattach-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
Related videos on Youtube
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, 2022Comments
-
rampion about 1 monthI am trying to figure out how to attach to a
tmux sessionif a named tmux session exists, if not I want to create a new one with the given name.Currently, I know of a few
tmuxcommands 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 attachattaches to an automatically existing session - but errors out if no session existstmux newcreates a new session - but it does so every time, so I can't leave it in my.tmux.conftmux has-sessiontests 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 over 11 years@kzh: I view it as a programming tool question, like vim -
chakrit about 9 yearsI have written another possible answer for this question as a gist, in case anyone's interested: gist.github.com/chakrit/5004006 -
Petr Viktorin over 8 yearsMeanwhile, myman tmuxsays: "The -A flag makes new-session behave like attach-session if session-name already exists" -
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 Путлер Капут 六四事 about 3 years
-
Andrew about 10 yearsThis 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 almost 10 yearsIf you are in and out of your session often, this leaves lots of unused sessions, as seen bytmux list-sessions. -
Michael over 9 yearsYeah, it does, I just clean them up every now and then. It's a minor drawback to get the functionality I want. -
azat about 9 yearsI have next alias in bash -alias tm='tmux attach || tmux new' -
Cheezmeister over 8 yearsUpvoting 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 over 8 years@RandalSchwartz, yes - whynew-sessionis better? -
daboross about 8 yearsI 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 almost 7 yearsNote to those unfamiliar with tmux and wondering aboutnewvsnew-session: they are synonyms, and so areattachandattach-session. -
Michael over 6 yearsHey @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 over 6 yearsI 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 over 6 yearsProper 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 almost 6 yearstmux new-session -ds default \; split-window -dv 2>/dev/null; tmux attach -t defaultworks far better and does not open a second tmux in case you/bin/killthe first one. The only downside is that you need to name the sessions for this. -
pjincz about 5 yearsBy now, you can just type:tmux new -A -s defaultto launch a new session if it is not exist or attach automatically. I think it's much better than editing config file. -
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 about 4 years@rampion, the link doesnt seem to be working.. also a better solution maybe available here: stackoverflow.com/questions/3432536/… -
dragon788 almost 4 yearsIf you are going to use this in something likegnome-terminalas the command I'd suggest leaving off the-sand the specific session name so you don't end up with EVERY newgnome-terminalsession attached to the same session. You can always select an existing session withprefix + safter opening a new terminal. -
Chang Ye almost 2 yearsSomeone who met a unexpected error to run this command with tmux 3.2 can trytmux a || true && tmtux n, which is more robust.