Как я могу узнать, нахожусь ли я на экране?
При использовании экрана в Linux, как я могу узнать, нахожусь ли я на экране или нет? я мог бы сделать exit
и я выйду из экрана, если я был в одном, но если бы я не был, тогда я закончу тем, что закрыл свой терминал.
При выполнении screen -r
, Я мог видеть, если у меня есть другие присоединенные экраны, но как я узнаю, является ли мой текущий терминал одним из тех прикрепленных экранов?
11 ответов
Проверьте $STY
, Если это ноль, вы находитесь на "реальном" терминале. Если он содержит что-то, это имя экрана, на котором вы находитесь.
Если вы не на экране:
eric@dev ~ $ echo $STY
eric@dev ~ $
Если вы находитесь на экране:
eric@dev ~ $ echo $STY
2026.pts-0.ip-10-0-1-71
Еще один способ, которым я это сделал, это повторить $TERM. Так как я в итоге много делал, я добавил псевдоним в мой файл.bashrc:
alias trm='echo $TERM'
Таким образом, на экране или нет, если я просто выполню "trm", он покажет мне, находится ли я на экране или где-то еще (обычно XTERM).
Альтернативный подход, чтобы проверить, если вы находитесь на экране.
тип:
Ctrl-a ?
Если вы видите экран помощи, вы находитесь на экране.
В противном случае вы получите знак вопроса "?" на подсказку.
Просто введите echo $STY
; это вернет прикрепленный экран с идентификатором процесса, например
$ echo $STY
34046.myScreen
Поскольку все остальные методы здесь полагаются на переменные окружения (которые могут быть просто переопределены) или на командный символ для экрана (который также может быть переопределен), наиболее надежный способ проверки состоит в перечислении всех предков текущего процесса.
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
Мое решение проблемы намного проще: простое нажатие на клавишу TAB заставляет весь терминал мигать (быстрая инверсия видео), если вы находитесь внутри экрана GNU.
Протестировано для работы с большинством Linux (Ubuntu, Kali, Debian, RaspBerry... и т. Д.) И FreeBSD, GUI и любым терминалом, локальным или удаленным, включая CtrlAltFn.
В качестве исключения для этого метода, обратите внимание на этот (довольно сложный, но возможный) сценарий:
- 1.- SSH в компьютер A (предположим, Linux).
- 2.- Введите новый
screen -S AScr
с удаленного терминала на компьютере А. - 3.- SSH с экрана GNU
AScr
терминал в компьютер Б. - 4.- Введите новый
screen -S BScr
с удаленного терминала на компьютере Б.
Вы внутри Screen
в случаях 2 и 4 и вне Screen
в случаях 1 и 3, но терминал будет мигать в случаях 2, 3 и 4.
Отметьте $STY. Если он нулевой, вы на «реальном» терминале. Если он что-то содержит, это имя экрана, на котором вы находитесь.
Если вы не на экране:
whoami@root ~ $ echo $STY
Если вы находитесь на экране:
whoami@root ~ $ echo $STY
2708518.pts-3.vm2135830
Пока 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
если вы просто хотите визуальную подсказку и не нужно делать что-то конкретное
Добавьте одно или несколько из следующих .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
набрав простые команды.
Проблема с большинством из приведенных выше ответов заключается в том, что мы можем оказаться в подоболочке прикрепленного сеанса экрана. Или мы можем открыть оболочку для удаленного хоста из сеанса экрана. В первом случае мы можем пройти происхождение дерева процессов и сопоставить 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 или что-то еще, так что, опять же, не стоит оптимизировать.
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.