web-dev-qa-db-fra.com

Comment démarrer tmux avec attach si une session existe

Si j'utilise

tmux attach

Je peux joindre à une session en cours mais s'il n'y a pas de session en cours, je ne reçois que l'erreur

no sessions

Comment puis-je démarrer automatiquement une nouvelle session s'il n'y en a pas? quelque chose comme

tmux attach-or-create-new-session
115
rubo77

La réponse est beaucoup plus simple. Mettez simplement ceci dans votre ~/.tmux.conf fichier:

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

Si vous exécutez tmux attach et il y a une session, puis elle sera attachée à cette session (qu'elle soit déjà attachée ou non). S'il y a déjà pas une session, il en créera une pour vous.

61
Joe Casadonte

Si le nom de votre session est correct, il est facile de le faire avec le new-session commande:

tmux new-session -A -s main

main est le nom de la session qui sera attaché ou créé si nécessaire.

De man tmux:

Le -A le drapeau fait new-session se comporte comme attach-session si nom-session existe déjà; dans ce cas, -D se comporte comme -d à attach-session.

Veuillez également noter que le -A L'option est introduite dans tmux version 1.8 à partir du 26 mars 201 , pour les versions antérieures, utilisez tmux attach || tmux.

156
Wesley Baugh

Cela démarrera une nouvelle session si l'attachement donne une erreur:

tmux attach || tmux new

Un alias fera donc l'affaire:

tm="tmux attach || tmux new"
38
rubo77

Pensez à ajouter ce qui suit à votre .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

Vous pouvez voir mon utilisation de cela dans mon fichier de ressources ZSH à mon dépôt github

3
sparticvs

Pour développer la réponse de Wesley Baugh (qui était des sessions à double imbrication pour moi lorsqu'il était utilisé dans .bashrc sur les connexions) et ajouter un peu de flexibilité car j'utilise souvent Sudo -s sur les serveurs (qui chargeraient à nouveau consciencieusement mon .bashrc et double imbriquer), voici ce que j'ai dans mon .bashrc:

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

Ceci vérifie une session tmux et s'assure que vous n'êtes pas superutilisateur avant de créer une nouvelle session ou de l'attacher à celle existante nommée main.

2
Celsius1414

J'ai un peu amélioré la réponse @SuperMagic. Je mets ce bloc en haut de mon .zshrc

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

Si vous l'utilisez dans un fichier .shrc ou similaire avec exec je recommanderais

if tmux ls
  exec tmux attach
else
  exec tmux
fi
1
Aaron J Lang

Drew Frank a répondu à ceci ici: https://superuser.com/questions/487363/tmux-equivalent-of-screen-r

Voici le script que j'utilise maintenant pour cela (cependant, je suis revenu à l'écran en raison d'un autre problème avec tmux) /somewhere/on/your/path/ttmux ou en tant que fonction 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

Le -2 les options font que tmux assume la prise en charge des terminaux 256 couleurs, donc celles-ci peuvent ne pas convenir à votre situation.

1
SuperMagic

Voici une solution alternative de ce blog . Fonctionne comme un charme.

session="main"

# Check if the session exists, discarding output
# We can check $? for the exit status (zero for success, non-zero for failure)
tmux has-session -t $session 2>/dev/null

if [ $? != 0 ]; then
  # Set up your session
fi

# Attach to created session
tmux attach-session -t $session

De page de manuel

has-session [-t target-session] (alias: has)
Report an error and exit with 1 if the specified session does not exist.
If it does exist, exit with 0.
0
Levon