Как запустить 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.