Как я могу определить, нахожусь ли я на экране? - PullRequest
68 голосов
/ 22 марта 2011

При использовании экрана в Linux, как я могу узнать, нахожусь ли я на экране или нет? Я мог бы сделать exit, и я выйду из экрана, если я был в одном, но если я не был, тогда я закончу тем, что закрыл свой терминал.

При выполнении screen -r я мог видеть, подключены ли другие экраны, но как узнать, является ли мой текущий терминал одним из этих подключенных экранов?

Ответы [ 10 ]

113 голосов
/ 22 марта 2011

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

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

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

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

eric@dev ~ $ echo $STY
2026.pts-0.ip-10-0-1-71
14 голосов
/ 09 августа 2012

Еще один способ, которым я это сделал, - отобразить $ TERM. Так как я очень часто этим занимаюсь, я добавил псевдоним в мой файл .bashrc:

alias trm='echo $TERM'

Таким образом, на экране или нет, если я просто выполню 'trm', он покажет мне, на экране ли я или в другом месте (обычно XTERM).

10 голосов
/ 27 января 2014

Альтернативный подход, чтобы проверить, если вы находитесь на экране.

Тип:

Ctrl-a ?

Если вы видите экранную справку, вы находитесь на экране.

В противном случае вы получите вопросительный знак '?' в приглашении.

7 голосов
/ 06 декабря 2012

Просто введите echo $STY; это вернет прикрепленный экран с идентификатором процесса * например 1002 *

$ echo $STY 
  34046.myScreen
2 голосов
/ 08 июля 2015

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

pstree --show-parents -p $$ | head -n 1 | sed 's/\(.*\)+.*/\1/' | grep screen | wc -l

Если он печатает 1, то текущий запущенный процесс имеет предка со словом 'screen' в имени исполняемого файла, в противном случае его не было.

Более легкий видимый осмотр может быть получен из:

pstree --show-parents -p $$ | head -n 1 | sed 's/\(.*\)+.*/\1/' | less
1 голос
/ 29 августа 2016

Добавьте одно или несколько следующих элементов в ваш .bashrc

  • alias mysession='echo ${STY}'
  • alias myterm='echo ${TERM}'
  • alias isscreen='if test -n "$STY"; then echo " screen session: ${STY}"; else echo " NOT a screen session"; fi'

Тогда вы можете узнать, находитесь ли вы внутри screen, набрав простые команды.

1 голос
/ 09 сентября 2015

Пока ssh'd в удаленной (более старой) системе, я заметил, что $ TERM указывает, что я использую 'screen-256color', однако для этого не было записи termcap / terminfo, поэтому я был вынужден прибегнуть к следующему в .bashrc, чтобы запретить терминалу производить случайный мусор:

case $TERM in 
    (screen-256color) export TERM='screen'
esac

, чтобы вместо него использовать простую запись.

TL; DR, $ TERM будет обычно указывать, находитесь ли вы в сеансе экрана при удаленном ssh. Вы можете использовать case $TERM in (screen*) echo "you are in a screen session"; esac, если вам нужна визуальная подсказка и вам не нужно делать что-то конкретное

0 голосов
/ 21 октября 2017

Мое решение проблемы намного проще: просто нажатие TAB заставляет полный терминал мигать (быстрая инверсия видео), если вы внутри Экран GNU .

Протестировано работает на большинстве Linux (Ubuntu, Kali, Debian, RaspBerry ... и т. Д.) И FreeBSD , GUI и любом терминале, локальном или удаленном, включая Ctrl Alt Fn единицы.

В качестве исключения для этого метода обратите внимание на этот (довольно сложный, но возможный) сценарий:

  • 1.- SSH в компьютер A (предположим, Linux).
  • 2.- Введите новый screen -S AScr с удаленного терминала на компьютере A.
  • 3.- SSH с экрана GNU * терминал 1035 * на компьютер B.
  • 4.- Введите новый screen -S BScr с удаленного терминала на компьютере B.

Вы находитесь внутри Screen в случаях 2 и 4 и вне Screen в случаях 1 и 3, но терминал будет мигать в случаях 2, 3 и 4.

0 голосов
/ 22 сентября 2016

Проблема с большинством приведенных выше ответов заключается в том, что мы можем быть в subshell присоединенного сеанса экрана. Или мы можем открыть оболочку для удаленного хоста из сеанса экрана. В первом случае мы можем просмотреть происхождение дерева процессов и сопоставить имя программы screen. В последнем случае большую часть времени мы можем проверить переменную TERM на что-то вроде screen*.

Мой ответ похож на / u / Parthian-Shot, но не очень зависит от утилиты pstree; варианты, которые он использует, мне недоступны. С другой стороны, моя реализация все еще зависит от Linux: для не-Linux систем необходимо настроить команду ps; для систем со старыми оболочками, которые не поддерживают массивы, у вас будет еще больше обходных путей. Но все равно:

ps_walk_parents() {
  local tmp
  local ppid=$PPID
  while [[ $ppid != 1 ]]; do
    tmp=($( ps -o ppid,comm -p $ppid ))
    ppid=${tmp[0]}  # grab parent pid
    echo ${tmp[1]}  # output corresponding command name
  done
}
if [[ "$TERM" =~ screen* ]] || ps_walk_parents |grep -qxi screen ; then
  # we are in a screen terminal 
fi

Мы могли бы немного оптимизировать нашу функцию, чтобы прекратить поиск, если / когда родитель процесса совпадает с именем целевой команды («screen»), но в общем случае функция будет выполнять только 2–3 итерации. Предположительно, вы хотите поместить этот код в некоторую инициализацию запуска, такую ​​как .bashrc или .profile или что-то еще, так что, опять же, не стоит оптимизировать.

0 голосов
/ 22 марта 2011

screen -ls могу вам сказать.

Внешний экран:

$ screen -ls
There are screens on:
        16954.pts-1.auds916     (Detached)
        242.pts-8.auds916       (Detached)
2 Sockets in /tmp/screens/S-glennj.

Внутри экрана:

$ screen -ls
There are screens on:
        16954.pts-1.auds916     (Attached)
        242.pts-8.auds916       (Detached)
2 Sockets in /tmp/screens/S-glennj.
...