Wie kann ich bei der Verwendung von screen unter Linux feststellen, ob ich auf einem Bildschirm bin oder nicht? Ich könnte es tun exit
und 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 -r
konnte ich sehen, ob andere Bildschirme angeschlossen sind. Woher weiß ich jedoch, ob mein aktuelles Terminal einer dieser angehängten Bildschirme ist?
linux
shell
gnu-screen
user8125
quelle
quelle
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 einfachC-a
(oder eine beliebige Bildschirmbefehlstaste) +d
eingeben, 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.Antworten:
Ü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
quelle
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).
quelle
screen.linux
in einer Bildschirmsitzung angegeben.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.
quelle
Ctrl
+a
das Befehlszeichen für den Bildschirm ist. Während dies für die meisten Menschen zutrifft, sollte darauf hingewiesen werden, dass das Befehlszeichen durch das-e
Flag überschrieben werden kann , sodass dies nicht immer funktioniert.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
quelle
-p
,head -n 1 | sed 's/\(.*\)+.*/\1/'
undwc -l
ich 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 Befehlpstree --show-parents $$|grep -w screen
. Wenn jedoch jemand mit Ihren Umgebungsvariablen herumspielt, könnte er auch mit dem Namen der ausführbaren Datei herumspielen :)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"; esac
wenn Sie nur einen visuellen Hinweis wünschen und nichts Bestimmtes tun müssenquelle
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
screen
durch Eingabe einfacher Befehle feststellen, ob Sie sich in einem befinden .quelle
${TERM}
zu Ihrer Eingabeaufforderung in$PS1
. Das könnte auch in Ihrem gemacht werden.bashrc
. Wenn Sie beispielsweise$PS1
auf so etwas eingestellt sind[\u@\h \W]\$
, können Sie dies mit etwas wieexport PS1="[\u@\h ${TERM} \W]\$"
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:
screen -S AScr
vom Remote-Terminal auf Computer A ein.AScr
Terminal in Computer B.screen -S BScr
vom Remote-Terminal auf Computer B ein.Sie befinden sich in den
Screen
Fällen 2 und 4 und außerhalb derScreen
Fälle 1 und 3, aber das Terminal blinkt in den Fällen 2, 3 und 4.quelle
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
screen
Programmnamen abgleichen. Im letzteren Fall können wir dieTERM
Variable meistens auf so etwas überprüfenscreen*
.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
ps
Befehl 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.
quelle
env -i bash
). Oder wenn Ihr angeschlossenes Terminal tatsächlich über an einen anderen Host angeschlossen istssh
und die TERM-Variable beispielsweise im bashrc der anderen Hosts überschrieben wird.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.
quelle