Jak rozpocząć tmux z attach, jeśli sesja istnieje

91

Jeśli użyję

tmux attach

Mogę dołączyć do uruchomionej sesji, ale jeśli sesja nie jest uruchomiona, pojawia się tylko błąd

no sessions

Jak mogę automatycznie rozpocząć nową sesję, jeśli nie jest uruchomiona? coś jak

tmux attach-or-create-new-session
rubo77
źródło
powiązane: stackoverflow.com/questions/3432536/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:

51

Odpowiedź jest znacznie prostsza. Po prostu umieść to w swoim ~/.tmux.confpliku:

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

Jeśli uruchomisz tmux attachi istnieje sesja, zostanie ona dołączona do tej sesji (niezależnie od tego, czy jest już dołączona, czy nie). Jeśli nie ma jeszcze sesji, utworzy ją dla Ciebie.

Joe Casadonte
źródło
11
jest to fajna sztuczka, ale jest zastrzeżenie: jeśli tmuxzostanie wywołana bez argumentów, utworzy nową sesję, a następnie utworzy drugą sesję, gdy tylko osiągnie ten wiersz w twoim ~/.tmux.conf. Ten problem można zobaczyć, wykonując tmux lspo utworzeniu pierwszej sesji. W praktyce po umieszczeniu tego w pliku nie można już dzwonić tmuxbez żadnych argumentów
Bruno Polaco
4
Musisz więc dodać alias, alias tmux="tmux attach"aby zapobiec temu problemowi
rubo77
@BrunoPolaco: co to za duże zastrzeżenie z dodatkową pustą sesją tmux trwającą cały czas (poza tym nie wygląda to schludnie na liście zadań)?
rubo77
@ rubo77 Zasoby. Niektóre osoby mają kilka domyślnych narzędzi, okien, paneli itp. Utworzonych podczas uruchamiania tmux.
rovr138
129

Jeśli nazywanie sesji jest w porządku, możesz łatwo wykonać new-sessionpolecenie:

tmux new-session -A -s main

gdzie mainjest nazwa sesji, która zostanie dołączona lub utworzona w razie potrzeby.

Od man tmux:

-AFlag sprawia new-sessionzachowywać się jak attach-sessiongdyby sesja nazwa już istnieje; w tym przypadku -Dzachowuje się jak -dsię attach-session.

Należy również pamiętać, że -Aopcja została wprowadzona w wersji tmux 1.8od 26 marca 2013 r. W przypadku wcześniejszych wersji należy użyć tmux attach || tmux.

Wesley Baugh
źródło
10
+1 za korzystanie z wbudowanych funkcji i udostępnianie fragmentu dokumentu man
Ari Patrick
1
W moim liście alias: alias "tmux-attach-or-create-main-session=tmux new-session -A -s main". Dzięki za wskazówkę! Strona podręcznika: openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/tmux.1
Jeroen Wiert Pluimers
tmux: unknown option -- AWydaje się, że jest to dostępne tylko w najnowszych wersjach.
xApple
Jest to metoda, której użyłem, ale nie możesz już używać „tmux detach”. Aby zapisać i opuścić istniejącą sesję, musisz użyć skrótu <ctrl> b - d.
Jess,
2
[ -z "$TMUX" ] && exec tmux new -As .tego właśnie używam w swoim .bashrc.
ryenus
30

Rozpocznie się nowa sesja, jeśli dołączenie spowoduje błąd:

tmux attach || tmux new

Więc alias wykona zadanie:

tm="tmux attach || tmux new"
rubo77
źródło
Możesz nawet go skrócić, zmieniając tmux attachnatmux a
Bruno Polaco
Chociaż jest to funkcjonalne, rozwiązanie Wesleya Baugha wykorzystuje wbudowaną funkcjonalność tmux, aby zrobić to samo
Ari Patrick
fwiw wydaje się to najlepszą odpowiedzią na starsze wersje, zanim wprowadzono -A (np. v1.6)
Christopher Peterson
3

Rozważ dodanie następujących elementów do swojego .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

Możesz zobaczyć moje wykorzystanie tego w moim pliku zasobów ZSH na moim repozytorium github

sparticvs
źródło
2

Aby rozwinąć odpowiedź Wesleya Baugha (która była dla mnie sesjami podwójnego zagnieżdżania podczas używania w .bashrc przy logowaniu) i dodać trochę elastyczności, ponieważ często używam sudo -sna serwerach (które należycie ładowałyby mój .bashrc ponownie i podwójne gniazdo), oto co mam w moim .bashrc:

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

To sprawdza sesję tmux i upewnia się, że nie jesteś superużytkownikiem przed utworzeniem nowej sesji lub dołączeniem do istniejącej o nazwie main.

Celsjusza 1414
źródło
1

Drew Frank odpowiedział na to tutaj: https://superuser.com/questions/487363/tmux-equivalent-of-screen-r

Oto skrypt, którego teraz używam (jednak wróciłem do ekranu z powodu innego problemu z tmux) /somewhere/on/your/path/ttmuxlub jako funkcję powłoki:

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

Te -2opcje sprawiają tmux zakładamy 256 kolorów wspornik terminala, więc te mogą nie być odpowiednie dla danej sytuacji.

SuperMagic
źródło
1

Poprawiłem trochę odpowiedź @SuperMagic. Kładę ten blok na górze mojego.zshrc

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