Как запустить tmux с attach, если сессия существует


92

Если я использую

tmux attach

Я могу присоединиться к запущенному сеансу, но если сеанс не запущен, я получаю только ошибку

no sessions

Как я могу автоматически начать новый сеанс, если он еще не запущен? что-то вроде

tmux attach-or-create-new-session

Ответы:


52

Ответ намного проще. Просто поместите это в свой ~/.tmux.confфайл:

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

Если вы запустили tmux attachсеанс, то он будет присоединен к этому сеансу (независимо от того, подключен он или нет). Если не сеанс уже тогда он будет создавать для вас.


11
это хитрый трюк, но есть предостережение: если tmuxон вызывается без аргументов, он создаст новый сеанс, а затем создаст второй сеанс, как только достигнет этой строки в вашем ~/.tmux.conf. Вы можете увидеть эту проблему, выполнив tmux lsпосле создания первого сеанса. На практике, после того, как вы поместили это в свой файл, вы больше не можете звонить tmuxбез аргументов
Бруно Полако,

4
Таким образом, вы должны добавить псевдоним, alias tmux="tmux attach"чтобы предотвратить эту проблему
rubo77

@BrunoPolaco: что такое большое предостережение, когда дополнительный пустой сеанс tmux выполняется постоянно (кроме того, что он не выглядит аккуратно в списке задач)?
rubo77 26.09.16

@ rubo77 Ресурсы. У некоторых людей есть несколько стандартных инструментов, окон, панелей и т. Д., Созданных при запуске tmux.
rovr138

129

Если имя вашей сессии в порядке, то это легко сделать с помощью new-sessionкоманды:

tmux new-session -A -s main

где mainимя сеанса, которое будет присоединено или создано при необходимости.

От man tmux:

-AФлаг делает new-sessionсебя как attach-sessionесли сессия имя уже существует; в этом случае -Dведет себя как -dв attach-session.

Также обратите внимание, что -Aопция введена в версии tmux 1.8с 26 марта 2013 года , для более ранних версий используйте tmux attach || tmux.


10
+1 за использование встроенной функциональности и предоставление фрагмента man doc
Ари Патрик

1
В моем списке псевдонимов: alias "tmux-attach-or-create-main-session=tmux new-session -A -s main". Спасибо за чаевые! Страница руководства: openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/tmux.1
Йерун Вирт Плюмерс

tmux: unknown option -- AЭто только кажется, что доступно в последних версиях.
xApple

Это метод, который я использовал, но вы больше не можете использовать «tmux detach». Вам нужно использовать ярлык <ctrl> b - d, чтобы сохранить и выйти из существующего сеанса.
Джесс

2
[ -z "$TMUX" ] && exec tmux new -As .это то, что я использую в моем .bashrc.
ryenus

30

Это начнет новый сеанс, если attach выдает ошибку:

tmux attach || tmux new

Таким образом, псевдоним сделает работу:

tm="tmux attach || tmux new"

Вы даже можете сделать его короче, сменив tmux attachнаtmux a
Бруно Полако

В то время как это работает, решение Уэсли Боуга использует встроенную функциональность tmux, чтобы сделать то же самое
Ари Патрик

Между прочим, это кажется лучшим ответом для более старых версий, до того, как был представлен -A (например, v1.6)
Кристофер Петерсон

3

Попробуйте добавить следующее к вашему .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

Вы можете увидеть мое использование этого в моем файле ресурсов ZSH в моем репозитории github


2

Чтобы расширить ответ Уэсли Боуга (который для меня представлял собой сеансы двойного вложения при использовании в .bashrc при входе в систему) и добавить немного гибкости, поскольку я часто использую sudo -sна серверах (которые покорно загружают мой .bashrc снова и двойное гнездо), вот что у меня есть в моем .bashrc:

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

Это проверяет сеанс tmux и гарантирует, что вы не являетесь суперпользователем, прежде чем создавать новый сеанс или присоединяться к существующему с именем main.


1

Дрю Франк ответил на это здесь: https://superuser.com/questions/487363/tmux-equivalent-of-screen-r

Вот сценарий, который я сейчас использую для этого (хотя я переключился на экран из-за другой проблемы с tmux) /somewhere/on/your/path/ttmuxили в качестве функции оболочки:

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

Эти -2опции позволяют tmux предположить 256 цвет терминала поддержки, так что те , возможно , не подходит для вашей ситуации.



1

Я немного улучшил ответ @SuperMagic. Я положил этот блок наверху моего.zshrc

if [[ $TMUX = "" ]]; then
  # try to reattach sessions
  tmux ls | grep -vq attached && TMUXARG="attach-session -d"
  exec eval "tmux -2 $TMUXARG"
fi
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.