내가 화면에 있는지 어떻게 알 수 있습니까?
Linux에서 화면을 사용할 때 화면에 있는지 여부를 어떻게 알 수 있습니까? 내가 할 수 exit
있고 화면에 있으면 화면을 종료하지만 그렇지 않은 경우 터미널을 닫습니다.
를 할 때 screen -r
다른 화면이 연결되어 있는지 확인할 수 있지만 현재 터미널이 연결된 화면 중 하나인지 어떻게 알 수 있습니까?
확인하십시오 $STY
. null이면 "실제"터미널에있는 것입니다. 포함 된 내용이 있으면 현재있는 화면의 이름입니다.
화면에없는 경우 :
eric@dev ~ $ echo $STY
eric@dev ~ $
화면에있는 경우 :
eric@dev ~ $ echo $STY
2026.pts-0.ip-10-0-1-71
내가 한 또 다른 방법은 $ TERM을 에코하는 것입니다.
$ echo $TERM
screen
이 작업을 많이 수행하므로 .bashrc 파일에 별칭을 추가했습니다.
alias trm='echo $TERM'
이렇게하면 화면에 있든 없든 'trm'만 실행하면 화면에 있는지 아니면 다른 곳에 있는지 (보통 XTERM) 표시됩니다.
화면에 있는지 확인하는 다른 방법입니다.
유형:
Ctrl-a ?
화면 도움말이 표시되면 화면에있는 것입니다.
그렇지 않으면 물음표 '?'가 표시됩니다. 프롬프트에서.
여기에있는 다른 모든 방법은 환경 변수 (간단히 재정의 될 수 있음) 또는 화면의 명령 문자 (재정의 할 수 있음)에 의존하기 때문에 가장 확실한 확인 방법은 현재 프로세스의 모든 조상을 나열하는 것입니다.
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
ssh가 원격 (이전) 시스템에 들어가는 동안 $ 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
We could optimize our function a bit to stop searching if/when a process parent matches the target command name ("screen"), but in general, the function will only hit 2 to 3 iterations. Presumably you want to put this code in some startup initialization such as .bashrc or .profile or something, so again, not worth optimizing.
My solution to the problem is a lot simpler: just hitting TAB makes the full terminal blink (a quick video inversion) if you are inside GNU Screen.
Tested working on most Linux (Ubuntu, Kali, Debian, RaspBerry... etc) and FreeBSD, GUI and any terminal, local or remote, including CtrlAltFn ones.
As an exception for this method, please, note this (rather complex, but possible) case scenario:
- 1.- SSH into computer A (lets assume Linux).
- 2.- Enter a new
screen -S AScr
from remote terminal on computer A. - 3.- SSH from GNU Screen
AScr
terminal into Computer B. - 4.- Enter a new
screen -S BScr
from remote terminal on computer B.
You are inside a Screen
on cases 2 and 4, and outside a Screen
on cases 1 and 3, but the terminal will blink on cases 2, 3 and 4.
screen -ls
can tell you.
Outside screen:
$ screen -ls
There are screens on:
16954.pts-1.auds916 (Detached)
242.pts-8.auds916 (Detached)
2 Sockets in /tmp/screens/S-glennj.
Inside a screen:
$ screen -ls
There are screens on:
16954.pts-1.auds916 (Attached)
242.pts-8.auds916 (Detached)
2 Sockets in /tmp/screens/S-glennj.
참고URL : https://stackoverflow.com/questions/5392618/how-can-i-tell-whether-im-in-a-screen
'developer tip' 카테고리의 다른 글
$ (ProjectDir)의 값을 어떻게 알 수 있습니까? (0) | 2020.11.01 |
---|---|
jQuery는 div를 특정 인덱스로 삽입 (0) | 2020.11.01 |
IntelliJ : 스위치 케이스 생성 (0) | 2020.11.01 |
mscorlib는 무엇을 의미합니까? (0) | 2020.11.01 |
파이썬 시간 + 동등한 timedelta (0) | 2020.11.01 |