Присоединить или создать именованный сеанс экрана? (или постоянные сеансы экрана)

27

По сути, у меня есть сеанс удаленного экрана, к которому я хочу автоматически подключиться .. В настоящее время я делаю это с помощью следующей команды (в виде закладки iTerm или псевдонима)

ssh host -t screen -x thesessionname

Это работает нормально, но если сеанс умирает по какой-либо причине, я бы хотел, чтобы он был воссоздан при следующем подключении. -RФлаг screenявляется почти идеальным:

ssh host -t screen -R -S thesessionname

... но если сеанс уже подключен, то выполняется второй сеанс (при -Rпростом поиске первого отдельного сеанса, если ни один не найден, создается новый)

Есть ли способ заставить -Rфлаг искать также прикрепленные сеансы и создавать новый, только если thesessionnameон не существует?

Если это не легко выполнимо, как я могу автоматически воссоздать сеанс экрана, когда он умирает? Возможно, скрипт запускается через cron, который ищет именованный сеанс, создавая его, если он не существует?

DBR
источник

Ответы:

32

Скажите скрину быть более настойчивым в попытках:

-D -R
    Attach here and now. In detail this means: If a session is run-
    ning,  then  reattach.  If necessary detach and logout remotely
    first.  If it was not running create it and  notify  the  user.
    This is the author's favorite.

Так что объедините два, и у вас должно получиться решение ("-DR" эквивалентно "-D -R"):

screen -DR <yoursession> 

Кроме того, полезно знать, что вы можете просматривать запущенные сеансы с:

screen -ls
Дэн Карли
источник
5
Отлично, screen -x -R -S mainэто то , что я в конечном итоге использовал (работает так же, без принудительного отсоединения), спасибо!
DBR
Иногда вы хотите использовать sceen -r <yoursession>, выдаст ошибку, когда он уже подключен (вместо создания нового сеанса).
danger89
11

Несколько хороших вариантов. Во-первых, мой любимый:

screen -x -R

Он будет прикреплен к первой доступной сеансе экрана (общий доступ, если подключено другое соединение), а если сеансов экрана вообще не будет, начните новую.

screen -d -RR

Документы для этого гласят: «Снова подключите сеанс и при необходимости отсоедините или создайте его. Используйте первый сеанс, если доступно более одного сеанса». По сути, double-R заставляет его искать первую сессию для присоединения.

screen -D -RR

«Присоединяйся здесь и сейчас. Что бы это ни значило, просто сделай это». Отключит и удаленно выйдет из любого другого присоединенного сеанса и присоединится к первому сеансу, который может. По сути, делает все, что нужно, чтобы присоединиться к существующему сеансу, и создает новый, если там ничего нет.

Самая первая (-x -R) реже всего вызывает проблемы (не будет разъединять ваше другое соединение), но просто всегда присоединяется к чему-либо, если есть что-то, к которому нужно присоединиться, и создает что-то, если нет ничего, чтобы присоединиться.

Freiheit
источник
1
Все это хорошие / удобные варианты, но ни один из них не отвечает на первоначальный вопрос, который должен был (повторно) подключиться к сеансу по имени .
Даниил
5

я использую

screen -dRRS sessname

Я не хочу, чтобы весь мой логин на другой оболочке сбрасывался, как это -Dделает, и я определенно не хочу режим множественного присоединения -x.

хаос
источник