web-dev-qa-db-fra.com

Comment savoir si je suis sur un écran?

Lors de l'utilisation d'un écran sous Linux, comment savoir si je suis dans un écran ou non? Je pourrais faire exit et je quitterai un écran si j'étais dans un, mais si ce n'était pas le cas, je finirais par fermer mon terminal.

En faisant screen -r, Je pourrais voir si j'ai d'autres écrans attachés, mais comment savoir si mon terminal actuel est l'un de ces écrans attachés?

70
user8125

Vérifier $STY. S'il est nul, vous êtes sur un "vrai" terminal. S'il contient quelque chose, c'est le nom de l'écran dans lequel vous vous trouvez.

Si vous n'êtes pas à l'écran:

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

Si vous êtes à l'écran:

eric@dev ~ $ echo $STY
2026.pts-0.ip-10-0-1-71
115
jho

Une autre façon de le faire est de faire écho à $ TERM.

 $ echo $TERM
 screen

Comme je finis souvent par le faire, j'ai ajouté un alias dans mon fichier .bashrc:

alias trm='echo $TERM'

De cette façon, que ce soit à l'écran ou non, si j'exécute simplement 'trm', cela me montrera si je suis dans SCREEN ou ailleurs (généralement XTERM).

15
JJC

Approche alternative pour vérifier si vous êtes à l'écran.

type:

Ctrl-a ?

Si vous voyez l'aide à l'écran, vous êtes à l'écran.

Sinon, vous obtiendrez un point d'interrogation "?" sur l'invite.

11
pors

Entrez simplement echo $STY; cela renverra l'écran ci-joint avec l'identifiant du processus, par exemple

$ echo $STY 
  34046.myScreen
7
raim

Étant donné que toutes les autres méthodes reposent ici sur des variables d'environnement (qui peuvent simplement être remplacées) ou sur le caractère de commande pour screen (qui peut également être remplacé), la façon la plus infaillible de vérifier serait de répertorier tous les ancêtres du processus en cours.

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

S'il affiche 1, le processus actuel que vous exécutez a un ancêtre avec le mot "écran" dans le nom de l'exécutable, sinon il n'y en avait pas.

Une inspection visible plus facile pourrait être obtenue auprès de:

pstree --show-parents -p $$ | head -n 1 | sed 's/\(.*\)+.*/\1/' | less
2
Parthian Shot

Ajoutez un ou plusieurs des éléments suivants dans votre .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'

Ensuite, vous pouvez savoir si vous êtes dans un screen en tapant des commandes simples.

1
Lee

Alors que ssh était dans un système distant (ancien), j'ai remarqué que $ TERM indiquait que j'utilisais 'screen-256color', mais il n'y avait pas d'entrée termcap/terminfo pour cela, donc j'ai été obligé de recourir aux éléments suivants dans .bashrc pour empêcher le terminal de produire des déchets occasionnels:

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

pour qu'il utilise plutôt l'entrée simple.

TL; DR, $ TERM généralement indiquera si vous êtes en session écran lorsque ssh est distant. Vous pouvez utiliser case $TERM in (screen*) echo "you are in a screen session"; esac si vous voulez juste un indice visuel et n'avez pas besoin de faire quelque chose de spécifique

1
WebDragon

Ma solution au problème est beaucoup plus simple: juste frapper TAB fait le plein clignotement du terminal (une inversion vidéo rapide) si vous êtes à l'intérieur Écran GNU .

Testé sur la plupart des Linux (Ubuntu, Kali, Debian, RaspBerry ... etc) et FreeBSD, GUI et tout terminal, local ou distant, y compris CtrlAltFn ceux.

Comme exception pour cette méthode, veuillez noter ce scénario de cas (plutôt complexe, mais possible):

  • 1.- SSH dans l'ordinateur A (supposons que Linux).
  • 2.- Entrez un nouveau screen -S AScr depuis le terminal distant sur l'ordinateur A.
  • 3.- SSH depuis le terminal GNU Screen AScr vers l'ordinateur B.
  • 4.- Entrez un nouveau screen -S BScr depuis le terminal distant sur l'ordinateur B.

Vous êtes à l'intérieur d'un Screen sur les cas 2 et 4, et à l'extérieur d'un Screen sur les cas 1 et 3, mais le terminal clignotera sur les cas 2, 3 et 4.

0

Le problème avec la plupart des réponses ci-dessus est que nous pourrions être dans un sous-shell d'une session d'écran attachée. Ou nous pourrions ouvrir un shell à un hôte distant à partir d'une session d'écran. Dans le premier cas, nous pouvons parcourir la parenté de l'arbre de processus et faire correspondre le nom du programme screen. Dans ce dernier cas, la plupart du temps, nous pouvons vérifier la variable TERM pour quelque chose comme screen*.

Ma réponse est similaire à/u/Parthian-Shot mais pas tellement dépendante de l'utilitaire pstree; les options qu'il utilise ne sont pas disponibles pour moi. D'un autre côté, mon implémentation est toujours dépendante de Linux: pour les systèmes non Linux, il faut Tweak la commande ps; pour les systèmes avec des shells plus anciens qui ne prennent pas en charge les tableaux, vous aurez encore plus de solutions. Mais peu importe:

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

Nous pourrions optimiser un peu notre fonction pour arrêter la recherche si/quand un parent de processus correspond au nom de la commande cible ("écran"), mais en général, la fonction ne frappera que 2 à 3 itérations. Vraisemblablement, vous voulez mettre ce code dans une initialisation de démarrage telle que .bashrc ou .profile ou quelque chose, encore une fois, ne vaut pas la peine d'être optimisé.

0
Otheus