4

How can I attach to the the first tmux session that has no attached clients or, if there are no unattached sessions, create a new session and attach to that?

(The use case is for a command for my terminal emulator to run when opening a new terminal window. I don't want it to create a new session each time I open a window, if there are detached sessions lying around. Nor do I want it to re-attach to the same named session every time, if there's already a window attached to that session. I want it to recycle existing unattached sessions but create new sessions when there are none unattached.)

3 Answers 3

1

There may be a simpler way to do this using tmux itself, without resorting to shell scripts. But I got it working by combining a couple of scripts.

The first script prints out the name of the first unattached session. This is ,tmux-first-unattached-session:

#!/usr/bin/env sh
# Print the name of the first tmux session that has no clients attached.
tmux ls -F '#{session_name}|#{?session_attached,attached,not attached}' 2>/dev/null | grep 'not attached$' | tail -n 1 | cut -d '|' -f1

The second script attaches to the first unattached session or a new session:

#!/usr/bin/env sh
# Attach to the first tmux session that has no attached clients.
# If there are no unattached sessions, then create a new session.
tmux attach -t `,tmux-first-unattached-session` 2> /dev/null || tmux
5
  • Do you actually have a comma in your filename? Strictly speaking, there’s nothing wrong with that, but it is unconventional. Jul 8, 2019 at 21:57
  • 2
    I really do: rhodesmill.org/brandon/2009/commands-with-comma Jul 8, 2019 at 22:16
  • ­Interesting philosophy. Jul 9, 2019 at 0:59
  • 1
    This does not work anymore as of tmux 3.3: github.com/tmux/tmux/issues/3218#issuecomment-1156343466 This is because tmux attach -t now looks for a session if an invalid or none have been specified. The second script needs to be changed to check the return code of tmux-first-unattached-session Jun 15, 2022 at 12:41
  • @LarsFrancke yeah, thanks for the tip. I was just wondering why my config suddenly stopped working :-). Now have to fiddle a bit to make it working: bindsym $mod+Return exec --no-startup-id "xterm -e \\"tmux attach -t $(sess=$(tmux ls -F '#{session_name}|#{?session_attached,attached,not attached}' 2> /dev/null | grep 'not attached$' | tail -n 1 | cut -d '|' -f1) 2> /dev/null; echo ${sess:-fakesession}) || tmux\\"" Jun 30, 2022 at 2:10
1

I have something like this which is pretty simple.

  1. Detect if there is an un-attached session, try to attach
  2. Else start a clean session
# Start TMUX first; try to reattach a session
if [[ -z $TMUX ]]; then
  ATTACH_OPT=$(tmux ls | grep -vq attached && echo "attach -d")
  exec eval "tmux $ATTACH_OPT"
fi
1
  • 1
    Is there a reason you're doing exec eval and not just tmux $ATTACH_OPT?
    – evan
    Sep 12, 2020 at 1:06
0

I created a tmux2 script to handle this problem:

#!/bin/bash
#
# tmux2 - attach to first unattached session or
#         create new session if none are found
#
N=$(tmux ls | grep -v attached | head -1 | cut -d: -f1)

if [[ ! -z $N ]]
then
    ATTACH_OPTS="attach -t $N"
fi

exec tmux -CC $ATTACH_OPTS

In my case I'm using this for an iterm connection from my Mac. The connection is set up like this:

enter image description here

Now if my terminal session drops, I just reconnect and it picks up where I left things.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .