So starten Sie tmux mit attach, wenn eine Sitzung vorhanden ist

92

Wenn ich benutze

tmux attach

Ich kann eine laufende Sitzung verbinden, aber wenn keine Sitzung ausgeführt wird, wird nur der Fehler angezeigt

no sessions

Wie kann ich automatisch eine neue Sitzung starten, wenn keine ausgeführt wird? so etwas wie

tmux attach-or-create-new-session
rubo77
quelle
related: stackoverflow.com/questions/3432536/…
Ciro Santilli am

Antworten:

51

Die Antwort ist viel einfacher. Fügen Sie dies einfach in Ihre ~/.tmux.confDatei ein:

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

Wenn Sie ausführen tmux attachund eine Sitzung vorhanden ist, wird sie an diese Sitzung angehängt (unabhängig davon, ob sie bereits angehängt ist oder nicht). Wenn noch keine Sitzung vorhanden ist , wird eine Sitzung für Sie erstellt.

Joe Casadonte
quelle
11
Dies ist ein toller Trick, aber es gibt eine Einschränkung: Wenn er tmuxohne Argumente aufgerufen wird, wird eine neue Sitzung erstellt und dann eine zweite Sitzung, sobald er diese Zeile in Ihrem erreicht ~/.tmux.conf. Sie können dieses Problem feststellen, indem Sie tmux lsnach dem Erstellen der ersten Sitzung ausführen . In der Praxis können Sie, nachdem Sie dies in Ihre Datei aufgenommen haben, tmuxkeine Argumente mehr aufrufen
Bruno Polaco,
4
Sie müssten also einen Alias ​​hinzufügen alias tmux="tmux attach", um dieses Problem zu vermeiden
rubo77
@BrunoPolaco: Was ist die große Einschränkung bei einer zusätzlichen leeren tmux-Sitzung, die die ganze Zeit ausgeführt wird (ansonsten sieht es in der Aufgabenliste nicht aufgeräumt aus)?
Rubo77
@ rubo77 Ressourcen. Einige Benutzer haben beim Start einige Standardwerkzeuge, -fenster, -fenster usw. erstellt tmux.
Rovr138
129

Wenn die Benennung Ihrer Sitzung in Ordnung ist, können Sie den folgenden new-sessionBefehl verwenden:

tmux new-session -A -s main

Wo mainist der Sitzungsname, der bei Bedarf angehängt oder erstellt wird?

Von man tmux:

Das -AFlag new-sessionverhält sich so, als attach-sessionob der Sitzungsname bereits existiert. in diesem Fall -Dverhält sich gerne -dso attach-session.

Bitte beachten Sie auch, dass die -AOption in der tmux-Version 1.8ab dem 26. März 2013 eingeführt wird , für frühere Versionen verwenden tmux attach || tmux.

Wesley Baugh
quelle
10
+1 für die Verwendung der integrierten Funktionalität und Bereitstellung von Man Doc Snippet
Ari Patrick
1
In meiner Alias - Liste: alias "tmux-attach-or-create-main-session=tmux new-session -A -s main". Danke für den Tipp! Handbuchseite: openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/tmux.1
Jeroen Wiert Pluimers
tmux: unknown option -- ADies scheint nur in neueren Versionen verfügbar zu sein.
xApple
Dies ist die Methode, die ich verwendet habe, aber Sie können "tmux detach" nicht mehr verwenden. Sie müssen die Tastenkombination <Strg> b - d verwenden, um eine vorhandene Sitzung zu speichern und zu beenden.
Jess
2
[ -z "$TMUX" ] && exec tmux new -As .das verwende ich in meinem .bashrc.
Ryenus
30

Dies startet eine neue Sitzung, wenn beim Anhängen ein Fehler auftritt:

tmux attach || tmux new

Ein Alias ​​erledigt also die Aufgabe:

tm="tmux attach || tmux new"
rubo77
quelle
Sie können es sogar kürzer machen, indem Sie tmux attachfürtmux a
Bruno Polaco
Während dies funktioniert, nutzt die Lösung von Wesley Baugh die in tmux integrierte Funktionalität, um dasselbe zu tun
Ari Patrick
fwiw Dies scheint die beste Antwort für ältere Versionen zu sein, bevor -A eingeführt wurde (z. B. v1.6)
Christopher Peterson
3

Erwägen Sie, das Folgende zu Ihrem hinzuzufügen .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

Sie können meine Verwendung in meiner ZSH-Ressourcendatei in meinem Github-Repo sehen

sparticvs
quelle
2

Um die Antwort von Wesley Baugh (die für mich bei der Verwendung von .bashrc für Anmeldungen eine doppelte Verschachtelung war) zu erweitern und ein wenig Flexibilität hinzuzufügen, da ich sie häufig sudo -sauf Servern verwende (die meine .bashrc-Datei pflichtgemäß erneut laden und doppelt verschachteln würden), siehe unten was ich in meiner .bashrc habe:

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

Dadurch wird nach einer tmux-Sitzung gesucht und sichergestellt, dass Sie kein Superuser sind, bevor Sie eine neue Sitzung erstellen oder eine Verbindung zu der vorhandenen Sitzung mit dem Namen herstellen main.

Celsius1414
quelle
1

Drew Frank hat dies hier beantwortet: https://superuser.com/questions/487363/tmux-equivalent-of-screen-r

Hier ist das Skript, das ich jetzt benutze (obwohl ich wegen eines anderen Problems mit tmux wieder zum Bildschirm zurückgeschaltet habe) /somewhere/on/your/path/ttmuxoder als Shell-Funktion:

#!/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

Die -2Optionen veranlassen tmux, Unterstützung für 256-Farben-Terminals anzunehmen, sodass diese möglicherweise nicht für Ihre Situation geeignet sind.

SuperMagic
quelle
1

Ich habe die @ SuperMagic-Antwort ein wenig verbessert. Ich setze diesen Block oben auf meinen.zshrc

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