Wie kann ich feststellen, ob ich auf einem Bildschirm bin?

77

Wie kann ich bei der Verwendung von screen unter Linux feststellen, ob ich auf einem Bildschirm bin oder nicht? Ich könnte es tun exitund ich werde einen Bildschirm verlassen, wenn ich in einem war, aber wenn ich es nicht wäre, würde ich am Ende mein Terminal schließen.

Dabei screen -rkonnte ich sehen, ob andere Bildschirme angeschlossen sind. Woher weiß ich jedoch, ob mein aktuelles Terminal einer dieser angehängten Bildschirme ist?

user8125
quelle
Wenn Sie sich auf dem Bildschirm befinden und ausgeführt werden screen -r, werden Sie darüber informiert, dass Sie sich auf einem Bildschirm befinden (oder wenn keine Bildschirme vorhanden sind, werden Sie darauf hingewiesen , dass Sie möglicherweise nicht auf einem Bildschirm sein können), und wenn Sie dies tun Wenn Sie sich nicht in einem Bildschirm befinden und an einen angehängt werden, können Sie einfach C-a(oder eine beliebige Bildschirmbefehlstaste) + deingeben, um den gerade eingegebenen Bildschirm zu verlassen. Das ist eine einfache Möglichkeit, dies zu erkennen. Es lohnt sich jedoch nicht, eine Antwort zu geben, da ich davon ausgehe, dass das OP diese Option bereits kannte / ablehnte.
Parthian Shot

Antworten:

128

Überprüfen Sie $STY. Wenn es null ist, befinden Sie sich auf einem "echten" Terminal. Wenn es etwas enthält, ist es der Name des Bildschirms, auf dem Sie sich befinden.

Wenn Sie nicht auf dem Bildschirm sind:

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

Wenn Sie auf dem Bildschirm sind:

eric@dev ~ $ echo $STY
2026.pts-0.ip-10-0-1-71
jho
quelle
4
Wofür steht STY?
Steven Sie
2
@StevenYou Alles, was ich jemals gefunden habe, ist "alternativer Socket-Name" . Was die Wahl des Variablennamens nicht wirklich erklärt.
Ahruss
1
Dies funktioniert, wenn Sie sich auf demselben Computer befinden, auf dem Sie den Bildschirm gestartet haben. Wenn Sie auf eine neue Maschine ssh, müssen Sie die Variable übergeben. (dh ssh user @ host "STY = $ STY")
Aaron Oommen
8
@StevenYou steht wahrscheinlich für "Screen TYpewriter" oder "Socket TYpewriter". TTY steht für "TeleTYpewriter", PTY für "Pseudoterminal TYpewriter". Sie dachten wahrscheinlich, es sei offensichtlich genug, dass sie ihre Argumentation nicht explizit erwähnen mussten. Wie dieses Gespräch beweist, haben sie sich geirrt.
Parthian Shot
3
Für das, was es wert ist, scheint dies mit tmux unter osx nicht zu funktionieren, wohingegen die auf "$ TERM" basierende Prüfung dies tut.
Andrei Bârsan
16

Eine andere Art, wie ich es gemacht habe, ist das Echo von $ TERM.

 $ echo $TERM
 screen

Da ich dies häufig mache, habe ich meiner .bashrc-Datei einen Alias ​​hinzugefügt:

alias trm='echo $TERM'

Auf diese Weise wird mir, ob auf dem Bildschirm oder nicht, wenn ich nur 'trm' ausführe, angezeigt, ob ich mich im BILDSCHIRM oder anderswo befinde (normalerweise XTERM).

JJC
quelle
Zur Verdeutlichung wird unter Linux der Wert von $ TERM screen.linuxin einer Bildschirmsitzung angegeben.
Parthian Shot
Glücklicherweise ist der Wert von $ TERM unter tmux "screen" (zumindest unter OS X)
Michael
1
Tatsächlich gibt Parthian, zumindest in allen aktuellen OS-X / macOS-, allen aktuellen CentOS- und Ubuntu-Versionen (mindestens 14.04), $ TERM nur "Bildschirm" zurück. Nicht sicher, unter welcher Version von OS / Kernel / Shell "screen.linux" angezeigt wird.
JJC
13

Alternativer Ansatz, um zu überprüfen, ob Sie sich auf dem Bildschirm befinden.

Art:

Ctrl-a ?

Wenn Sie die Bildschirmhilfe sehen, befinden Sie sich auf dem Bildschirm.

Andernfalls erhalten Sie ein Fragezeichen '?' an der Eingabeaufforderung.

pors
quelle
1
Dies setzt natürlich voraus, dass Ctrl+ adas Befehlszeichen für den Bildschirm ist. Während dies für die meisten Menschen zutrifft, sollte darauf hingewiesen werden, dass das Befehlszeichen durch das -eFlag überschrieben werden kann , sodass dies nicht immer funktioniert.
Parthian Shot
Dies funktioniert hervorragend (Strg + a dann "Escape" zum Beispiel). Obwohl ich denke, dass es Ihren Cursor an den Anfang der aktuellen Zeile bewegen könnte, wenn Sie sich nicht auf einem Bildschirm befinden ...: |
Rogerdpack
2

Da alle anderen Methoden hier auf Umgebungsvariablen (die einfach überschrieben werden können) oder dem Befehlszeichen für screen (das auch überschrieben werden kann) beruhen, besteht die narrensicherste Methode zur Überprüfung darin, alle Vorfahren des aktuellen Prozesses aufzulisten.

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

Wenn 1 ausgegeben wird, hat der aktuelle Prozess, den Sie ausführen, einen Vorfahren mit dem Wort 'screen' im Namen der ausführbaren Datei, andernfalls nicht.

Eine einfachere sichtbare Inspektion kann erhalten werden von:

pstree --show-parents -p $$ | head -n 1 | sed 's/\(.*\)+.*/\1/' | less
Parthian Shot
quelle
1
Interessanter Ansatz. Sie benötigen jedoch keines von beiden -p, head -n 1 | sed 's/\(.*\)+.*/\1/'und wc -lich würde vorschlagen, aus Sicherheitsgründen -w zu grep hinzuzufügen (es entspricht nur einem Programm mit dem Namen "screen" und nicht mit "screenish"). Das ist also der letzte Befehl pstree --show-parents $$|grep -w screen. Wenn jedoch jemand mit Ihren Umgebungsvariablen herumspielt, könnte er auch mit dem Namen der ausführbaren Datei herumspielen :)
herumspielt, herumspielen ndemou
1

Während ich in ein entferntes (älteres) System ssh'd, bemerkte ich, dass $ TERM anzeigte, dass ich 'screen-256color' verwendete, es gab jedoch keinen Termcap / terminfo-Eintrag dafür, so dass ich gezwungen war, in .bashrc auf Folgendes zurückzugreifen Verhindern Sie, dass das Terminal gelegentlich Müll produziert:

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

um es dazu zu bringen, stattdessen den einfachen Eintrag zu verwenden.

TL; DR, $ TERM wird normalerweise an, ob Sie sich in einer Bildschirmsitzung befinden, wenn ssh remote ausgeführt wird. Sie können verwenden, case $TERM in (screen*) echo "you are in a screen session"; esacwenn Sie nur einen visuellen Hinweis wünschen und nichts Bestimmtes tun müssen

WebDragon
quelle
1

Fügen Sie eine oder mehrere der folgenden Optionen zu Ihrer hinzu .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'

Dann können Sie screendurch Eingabe einfacher Befehle feststellen, ob Sie sich in einem befinden .

Lee
quelle
1
Eine Variante dieser Methode ist das Hinzufügen ${TERM}zu Ihrer Eingabeaufforderung in $PS1. Das könnte auch in Ihrem gemacht werden .bashrc. Wenn Sie beispielsweise $PS1auf so etwas eingestellt sind [\u@\h \W]\$, können Sie dies mit etwas wieexport PS1="[\u@\h ${TERM} \W]\$"
Rhubbarb
Ich mache jetzt so etwas, außer ein bisschen schicker. :). Ich füge ein helles "S" an einer Stelle meiner Eingabeaufforderung hinzu, wenn $ TERM == 'screen'. Es ist trivial, immer zu wissen, ob ich dabei bin oder nicht, ohne etwas zu tippen. Ich überlasse das Wie als Übung dem Leser.
JJC
1

Meine Lösung für das Problem ist viel einfacher: Wenn Sie nur auf drücken, TAB blinkt das gesamte Terminal (eine schnelle Video-Inversion), wenn Sie sich im GNU-Bildschirm befinden .

Getestet unter den meisten Linux- Versionen (Ubuntu, Kali, Debian, RaspBerry usw.) und FreeBSD , GUI und allen lokalen oder Remote-Terminals, einschließlich CtrlAltFnsolcher.

Beachten Sie als Ausnahme für diese Methode bitte dieses (ziemlich komplexe, aber mögliche) Fallszenario:

  • 1.- SSH in Computer A (nehmen wir Linux an).
  • 2.- Geben Sie ein neues screen -S AScrvom Remote-Terminal auf Computer A ein.
  • 3.- SSH vom GNU Screen AScrTerminal in Computer B.
  • 4.- Geben Sie ein neues screen -S BScrvom Remote-Terminal auf Computer B ein.

Sie befinden sich in den ScreenFällen 2 und 4 und außerhalb der ScreenFälle 1 und 3, aber das Terminal blinkt in den Fällen 2, 3 und 4.

Sopalajo de Arrierez
quelle
0

Das Problem bei den meisten der oben genannten Antworten besteht darin, dass wir uns möglicherweise in einer Unterschale einer angehängten Bildschirmsitzung befinden. Oder wir öffnen eine Shell für einen Remote-Host innerhalb einer Bildschirmsitzung. Im ersteren Fall können wir die Abstammung des Prozessbaums durchlaufen und den screenProgrammnamen abgleichen. Im letzteren Fall können wir die TERMVariable meistens auf so etwas überprüfen screen*.

Meine Antwort ähnelt / u / Parthian-Shot, ist aber nicht so abhängig vom Dienstprogramm pstree. Die Optionen, die er verwendet, stehen mir nicht zur Verfügung. Andererseits ist meine Implementierung immer noch Linux-abhängig: Bei Nicht-Linux-Systemen muss der psBefehl angepasst werden . Für Systeme mit älteren Shells, die keine Arrays unterstützen, stehen noch mehr Problemumgehungen zur Verfügung. Aber wie auch immer:

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

Wir könnten unsere Funktion ein wenig optimieren, um die Suche zu beenden, wenn ein übergeordneter Prozess mit dem Zielbefehlsnamen ("Bildschirm") übereinstimmt, aber im Allgemeinen trifft die Funktion nur 2 bis 3 Iterationen. Vermutlich möchten Sie diesen Code in eine Startinitialisierung wie .bashrc oder .profile oder etwas anderes einfügen, was wiederum keine Optimierung wert ist.

Otheus
quelle
Soweit ich das beurteilen kann, ist Ihre Methode nützlich, wenn wir uns in einer Subshell einer angehängten Bildschirmsitzung befinden, in der $ TERM und $ STY nicht erhalten bleiben. Können Sie ein Beispiel geben, wie dies geschehen wird, denn egal was ich ausprobiert habe, $ TERM und $ STY wurden immer beibehalten.
Ndemou
Sie bleiben beim Start erhalten , aber nicht unbedingt, wenn Sie zu einer Subshell wechseln (Try env -i bash). Oder wenn Ihr angeschlossenes Terminal tatsächlich über an einen anderen Host angeschlossen ist sshund die TERM-Variable beispielsweise im bashrc der anderen Hosts überschrieben wird.
Otheus
-3

screen -ls kann es dir sagen.

Außenbildschirm:

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

Innerhalb eines Bildschirms:

$ screen -ls
There are screens on:
        16954.pts-1.auds916     (Attached)
        242.pts-8.auds916       (Detached)
2 Sockets in /tmp/screens/S-glennj.
Glenn Jackman
quelle
7
Nicht wirklich. Nur weil ein Bildschirm angehängt ist, heißt das nicht, dass Sie sich darin befinden. Es kann genauso gut von einem anderen Terminal aus angeschlossen / geöffnet werden.
Andol