Comment savoir si je cours ou non à l'intérieur d'un "écran" linux?

60

L '"écran" fait référence à un programme mentionné dans Comment se reconnecter à une session SSH déconnectée . C'est un bon établissement.

Mais il y a une question que j'aimerais vraiment savoir. Comment savoir si je cours dans un "écran"? La différence est:

  • Si tel est le cas, je sais que je peux fermer en toute sécurité la fenêtre du terminal actuel, par exemple, une fenêtre PuTTY, sans perdre ma session shell (Bash, etc.).
  • Si non, je sais que je dois m'occuper des travaux en attente avant de fermer la fenêtre du terminal.

Mieux, j'aimerais que cet état soit affiché dans l'invite PS1 afin que je puisse le voir à tout moment automatiquement.

Jimm Chen
la source
3
Si vous utilisez tmux au lieu d’écran, vous obtenez une petite barre d’état par défaut. Ils sont à peu près les mêmes pour une utilisation de base.
Samuel Edwin Ward
9
Placez votre totem sur la table et laissez-le tourner. Si ça continue à tourner, tout va bien. Sinon, vous êtes dans un écran:]
Konerak
Vous pouvez également utiliser byobu avec screen et tmux. Il peut être configuré pour se charger automatiquement à la connexion, puis appuyer sur la touche F6 pour déconnecter et déconnecter.
mp3foley
Double possible de Comment vérifier si je suis en session écran?
Andrew Schulman

Réponses:

88

(Volé dans " Comment savoir si je suis dans un écran? " Sur StackOverflow et écrit par l'utilisateur jho . PS: vous ne pouvez pas voter pour un duplicata sur les sites StackExchange.)

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

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

[email protected] ~ $ echo $STY
[email protected] ~ $ 

Si vous êtes à l'écran:

[email protected] ~ $ echo $STY
2026.pts-0.ip-10-0-1-71

Si vous utilisez tmux au lieu d’écran, cochez également $TMUX. Pour ajouter ceci à votre invite, ajoutez ce qui suit à votre ~/.bashrc:

if [ -n "$STY" ]; then export PS1="(screen) $PS1"; fi
if [ -n "$TMUX" ]; then export PS1="(tmux) $PS1"; fi
Wesley
la source
2
si vous exécutez quelque chose sudopar défaut, il n'héritera pas des variables d'environnement, y compris $STY. Mais est généralement propagé à l'environnement sudo, alors vérifiez peut-être ou$TERM $STY $TERM=="screen"
coupez
14

Recherchez $STYce qui fournit des détails qui screenutilisent pour communiquer avec lui-même; $WINDOWsera alors le screennuméro de la fenêtre en cours .

geekosaur
la source
13

La simple vérification que j’utilise habituellement est d’appuyer simplement sur Ctrl- a:

  • Si le curseur saute au début de la ligne , je ne suis pas dans une session d'écran.

  • Si rien ne se passe , je sais que je suis dans une session d'écran et que je viens d'utiliser la touche de commande d'écran. Je tape ensuite a(saute au début de la ligne), w(affiche les fenêtres d'écran actuelles) ou exécute une autre commande d'écran "inoffensive" pour revenir à l'invite de commande.

(Bien sûr, cela ne fonctionne que si vous exécutez actuellement bash ou un autre logiciel qui "saute au début de la ligne" ou fait quelque chose d'inoffensif quand vous tapez Ctrl-a.)

Heinzi
la source
3
Cela ne fonctionne que si votre touche de contrôle d'écran est laissée à la valeur par défaut Ctrl-a, bien sûr.
ShreevatsaR
1
frapper la touche de contrôle + DD détacherait et terminerait ssh. Vous pouvez
utiliser
Bien que la réponse soit correcte pour la question, cette méthode n'est pas scriptable.
Nikodemus RIP
7

Eh bien, la plupart du temps (sans que quelqu'un essaie de tout gâcher), votre TERMvolonté sera réglée screen(ou du moins, mentionnée screenquelque part).

La solution facile au problème consiste simplement à exécuter l'écran partout. Ne partez pas sans elle, dis-je.

femme
la source
$TERMse propage aussi généralement à travers sudo, ce qui est un plus!
Rcoup
7

Je garde cela dans mon .bashrc:

 PS1='[\[email protected]\h \W'
 if [ "$WINDOW" ]; then PS1="$PS1 ($WINDOW)"; fi
 PS1="$PS1]$"

Ce n'est pas infaillible, mais chaque fois que je crée un nouvel écran, le numéro de la fenêtre apparaît dans l'invite. Si je ne cours pas screen, il n'y a pas de numéro.

Josh
la source
3

J'ai une façon encore plus cool.

Ajoutez ce qui suit à votre ~ / .screenrc et vous verrez une ligne d’état en bas (indiquant en texte inversé la date, l’heure et la charge du système. Plus de codes d’échappement trouvés dans le lien de la page de manuel ci-dessous.

    hardstatus alwayslastline
    hardstatus string '%Y-%m-%d %c | %l'

Source cette quand dans une session d'écran avec ctrl-a:source ~/.screenrc.

Je dois remercier Kyle Rankin de Linux Journal pour cela. Voir son article fantastique sur http://www.linuxjournal.com/article/10950 . La section de page de manuel à laquelle il fait référence se trouve à l’ adresse http://www.gnu.org/software/screen/manual/screen.html#String-Escapes .

HankCa
la source
2

vous pouvez également consulter l’arbre de processus depuis $$pour voir si vous trouvez une instance d’écran. la chaîne exacte dépendra probablement de votre configuration - sur mon OS X, un zshécran intérieur a loginpour parent, SCREENcomme screengrand-parent et comme arrière-grand-parent.

Aaron Davies
la source