Cómo iniciar tmux con adjuntar si existe una sesión

92

Si yo uso

tmux attach

Puedo adjuntarme a una sesión en ejecución, pero si no hay sesión en ejecución, solo aparece el error

no sessions

¿Cómo puedo iniciar automáticamente una nueva sesión si no hay ninguna en ejecución? algo como

tmux attach-or-create-new-session
rubo77
fuente
relacionado: stackoverflow.com/questions/3432536/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

52

La respuesta es mucho más simple. Solo pon esto en tu ~/.tmux.confarchivo:

# if run as "tmux attach", create a session if one does not already exist
new-session -n $HOST

Si ejecuta tmux attachy hay una sesión, se adjuntará a esa sesión (ya sea que esté adjunta o no). Si aún no hay una sesión, creará una para usted.

Joe Casadonte
fuente
11
este es un buen truco, pero hay una advertencia: si tmuxse invoca sin argumentos, creará una nueva sesión y luego creará una segunda sesión tan pronto como llegue a esta línea en su ~/.tmux.conf. Puede ver este problema ejecutando tmux lsdespués de crear la primera sesión. En la práctica, después de poner esto en su archivo, ya no puede llamar tmuxsin argumentos
Bruno Polaco
44
Por lo tanto, tendría que agregar un alias alias tmux="tmux attach"para evitar este problema
rubo77
@BrunoPolaco: ¿cuál es la gran advertencia con una sesión tmux extra vacía que se ejecuta todo el tiempo (aparte de eso no se ve ordenada en la lista de tareas)?
rubo77
@ Rubo77 Recursos. Algunas personas tienen algunas herramientas predeterminadas, ventanas, paneles, etc. creadas cuando se inician tmux.
rovr138
129

Si nombrar su sesión está bien, entonces es fácil hacerlo con el new-sessioncomando:

tmux new-session -A -s main

dónde mainestá el nombre de la sesión que se adjuntará o creará si es necesario.

De man tmux:

El -Aindicador hace que se new-sessioncomporte como attach-sessionsi el nombre de sesión ya existe; en este caso, -Dse comporta como -da attach-session.

Tenga en cuenta también que la -Aopción se presenta en la versión tmux 1.8del 26 de marzo de 2013 , para versiones anteriores, use tmux attach || tmux.

Wesley Baugh
fuente
10
+1 por usar la funcionalidad incorporada y proporcionar un fragmento de doc man
Ari Patrick
1
En mi lista de alias: alias "tmux-attach-or-create-main-session=tmux new-session -A -s main". ¡Gracias por el consejo! Página del manual: openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/tmux.1
Jeroen Wiert Pluimers
tmux: unknown option -- AEsto solo parece estar disponible en versiones recientes.
xApple
Este es el método que utilicé, pero ya no puedes usar "tmux detach". Debe usar el acceso directo <ctrl> b - d para guardar y salir de una sesión existente.
Jess
2
[ -z "$TMUX" ] && exec tmux new -As .Esto es lo que uso en mi .bashrc.
ryenus
30

Esto iniciará una nueva sesión si adjuntar da un error:

tmux attach || tmux new

Entonces un alias hará el trabajo:

tm="tmux attach || tmux new"
rubo77
fuente
Incluso puede hacerlo más corto cambiando tmux attachparatmux a
Bruno Polaco
Si bien esto es funcional, la solución de Wesley Baugh utiliza la funcionalidad incorporada de tmux para hacer lo mismo
Ari Patrick
Ahora bien, esta parece ser la mejor respuesta para versiones anteriores, antes de que se introdujera -A (por ejemplo, v1.6)
Christopher Peterson
3

Considere agregar lo siguiente a su .bashrc

if [ -z "$TMUX" ]; then
    base_session='my_session'
    # Create a new session if it doesn't exist
    tmux has-session -t $base_session || tmux new-session -d -s $base_session
    # Are there any clients connected already?
    client_cnt=$(tmux list-clients | wc -l)
    if [ $client_cnt -ge 1 ]; then
        session_name=$base_session"-"$client_cnt
        tmux new-session -d -t $base_session -s $session_name
        tmux -2 attach-session -t $session_name \; set-option destroy-unattached
    else
        tmux -2 attach-session -t $base_session
    fi
fi

Puede ver mi uso de esto en mi archivo de recursos ZSH en mi repositorio de github

sparticvs
fuente
2

Para ampliar la respuesta de Wesley Baugh (que fue para mí dos sesiones de anidamiento cuando se usaba en .bashrc en los inicios de sesión) y agregar un poco de flexibilidad, ya que a menudo lo uso sudo -sen servidores (que cargaría mi .bashrc nuevamente y doble anidación), aquí está lo que tengo en mi .bashrc:

if [ -z "$TMUX" ] && [ ${UID} != 0 ]
then
    tmux new-session -A -s main
fi

Esto comprueba si hay una sesión tmux y se asegura de que no seas superusuario antes de crear una nueva sesión o adjuntarla a una existente llamada main.

Celsius1414
fuente
1

Drew Frank respondió esto aquí: https://superuser.com/questions/487363/tmux-equivalent-of-screen-r

Aquí está el script que ahora uso para esto (sin embargo, volví a la pantalla debido a otro problema con tmux) /somewhere/on/your/path/ttmuxo como una función de shell:

#!/bin/sh
# many thanks to Drew Frank: https://superuser.com/questions/487363/tmux-equivalent-of-screen-r
(tmux ls | grep -vq attached && tmux -2 at) || tmux -2

Las -2opciones hacen que tmux asuma un soporte de terminal de 256 colores, por lo que puede no ser apropiado para su situación.

SuperMagic
fuente
1

Mejoré un poco la respuesta de @SuperMagic. Puse este bloque en la parte superior de mi.zshrc

if [[ $TMUX = "" ]]; then
  # try to reattach sessions
  tmux ls | grep -vq attached && TMUXARG="attach-session -d"
  exec eval "tmux -2 $TMUXARG"
fi
cmcginty
fuente