Как я узнаю, что я работаю внутри «экрана» Linux или нет?

60

«Экран» относится к программе, упомянутой в разделе «Как подключиться к отключенному сеансу SSH» . Это хорошая возможность.

Но есть вопрос, который я действительно хотел бы знать. Как узнать, бегу ли я внутри «экрана»? Разница в следующем:

  • Если да, я знаю, что могу безопасно закрыть текущее окно терминала, например, закрыть окно PuTTY, не теряя сеанс оболочки (Bash и т. Д.).
  • Если нет, я знаю, что должен позаботиться о любых незавершенных работах, прежде чем закрыть окно терминала.

Еще лучше, чтобы этот статус отображался в приглашении PS1, чтобы я мог видеть его в любое время автоматически.

Джимм Чен
источник
3
Если вы используете tmux вместо экрана, по умолчанию вы получаете небольшую строку состояния. Они практически одинаковы для базового использования.
Сэмюэль Эдвин Уорд
9
Поместите свой тотем на стол, и позвольте ему вращаться. Если он продолжает вращаться, ты в порядке. Иначе вы на экране:]
Конерак
Вы также можете использовать Byobu с экрана и Tmux. Можно настроить автоматическую загрузку при входе в систему, а затем нажать клавишу F6, чтобы отключиться и выйти из системы.
mp3foley
Возможный дубликат Как проверить, нахожусь ли я в сеансе экрана?
Эндрю Шульман

Ответы:

88

(Похищен у « Как я могу узнать, нахожусь ли я на экране? » В StackOverflow и создан пользователем jho . PS Вы не можете голосовать за дубликат на сайтах StackExchange.)

Проверьте $STY. Если он нулевой, вы находитесь на «реальном» терминале. Если он содержит что-то, это имя экрана, на котором вы находитесь.

Если вы не на экране:

eric@dev ~ $ echo $STY
eric@dev ~ $ 

Если вы находитесь на экране:

eric@dev ~ $ echo $STY
2026.pts-0.ip-10-0-1-71

Если вы используете tmux вместо экрана, также проверьте $TMUX. Чтобы добавить это к вашему приглашению, добавьте следующее к вашему ~/.bashrc:

if [ -n "$STY" ]; then export PS1="(screen) $PS1"; fi
if [ -n "$TMUX" ]; then export PS1="(tmux) $PS1"; fi
Wesley
источник
2
если вы запускаете что-то через sudoнего, по умолчанию не наследует переменные окружения, в том числе $STY. Но это , как правило , распространяется на окружающую среду SUDO, поэтому , возможно , проверить либо или$TERM $STY $TERM=="screen"
rcoup
14

Ищите, $STYкакие из них предоставляют детали, которые screenиспользуются для общения с самим собой; $WINDOWбудет текущий screenномер окна.

geekosaur
источник
13

Простая проверка Я обычно использую это просто хит Ctrl- a:

  • Если курсор переходит к началу строки , я не нахожусь внутри экранной сессии.

  • Если ничего не происходит , я знаю, что я нахожусь в сеансе экрана и что я только что использовал клавишу управления экраном. Затем я нажимаю a(перейти к началу строки), w(показать текущие окна экрана) или выполняю какую-то другую «безвредную» экранную команду, чтобы вернуться в командную строку.

(Конечно, это работает только в том случае, если вы в настоящее время выполняете bash или другое программное обеспечение, которое «переходит на начало строки» или делает что-то эквивалентное безвредным при нажатии Ctrl-a.)

Heinzi
источник
3
Это работает только в том случае, если ваша клавиша управления экраном, конечно, оставлена ​​на Ctrl-a по умолчанию.
ShreevatsaR
1
нажатие клавиши управления + DD отсоединит и завершит работу SSH. Вы можете нажать эту комбинацию для большего удобства
akostadinov
Несмотря на то, что ответ подходит для реального вопроса, этот метод не подходит для сценариев.
Никодим РИП
7

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

Простое решение проблемы - просто запустить экран везде. Не выходи из дома без этого, говорю я.

romble
источник
$TERMтакже обычно распространяется через sudo, что является плюсом!
встреча
7

Я держу это в моем .bashrc:

 PS1='[\u@\h \W'
 if [ "$WINDOW" ]; then PS1="$PS1 ($WINDOW)"; fi
 PS1="$PS1]$"

Это не надежно, но всякий раз, когда я создаю новый экран, он помещает номер окна в подсказку. Если я не бегу screen, номера нет.

мистифицировать
источник
3

У меня есть еще более прохладный способ.

Добавьте следующее в ваш ~ / .screenrc, и вы увидите строку состояния внизу (показывающую в перевернутом тексте дату, время и загрузку системы. Дополнительные коды перехода находятся в ссылке на страницу руководства ниже.

    hardstatus alwayslastline
    hardstatus string '%Y-%m-%d %c | %l'

Источник это, когда в сеансе экрана с ctrl-a:source ~/.screenrc.

Я должен поблагодарить Кайла Ранкина из Linux Journal за это. Смотрите его фантастическую статью на http://www.linuxjournal.com/article/10950 . Раздел справочной страницы, на который он ссылается, можно найти по адресу http://www.gnu.org/software/screen/manual/screen.html#String-Escapes .

HankCa
источник
2

Вы также можете восстановить дерево процессов, $$чтобы увидеть, не нашли ли вы экземпляр экрана. точная цепочка, вероятно, будет зависеть от вашей настройки - на моем компьютере с OS X zshвнутренний экран имеет loginсвоего родителя, SCREENдеда и screenпрадеда.

Аарон Дэвис
источник