Que dois-je savoir pour utiliser correctement GNU Screen? [fermé]


106

Je viens de présenter GNU Screen à un ami et ils ont du mal à s'y habituer. Cela me fait penser aux choses essentielles qu'il doit savoir sur l'excellent utilitaire Screen , les mêmes choses que vous penseriez utiles d'enseigner à quelqu'un, un débutant, de A à Z. Quelles sont quelques analogies et conseils pratiques pour se souvenir des liaisons, etc.?

Ça serait génial.


1
Il y a également de bonnes réponses à cela ici: stackoverflow.com/questions/70661/what-is-gnu-screen
Chris

Quelqu'un a publié une question similaire à celle-ci sur Server Fault .
Vagnerr

Si quelqu'un ne fait que commencer et a du mal avec Screen, il pourrait vouloir vérifier le tmux alternatif .
Christopher Bottoms

Réponses:


93

J'utilise Screendepuis plus de 10 ans et j'utilise probablement moins de la moitié des fonctionnalités. Il n'est donc certainement pas nécessaire d'apprendre toutes ses fonctionnalités tout de suite (et je ne recommanderais pas d'essayer). Mes commandes quotidiennes sont:

^A ^W - window list, where am I
^A ^C - create new window
^A space - next window
^A p - previous window
^A ^A - switch to previous screen (toggle)
^A [0-9] - go to window [0-9]
^A esc - copy mode, which I use for scrollback

Je pense que c'est ça. J'utilise parfois les fonctionnalités d'écran partagé, mais certainement pas quotidiennement. L'autre conseil est que si l'écran semble s'être verrouillé parce que vous avez frappé une combinaison de touches aléatoire par accident, faites les deux ^Qet ^A ^Qessayez de le déverrouiller.


1
^ Un k doit être ajouté à la liste pour fermer une fenêtre.
Léo Léopold Hertz 준영

7
Je n'utilise pas ^ A k à cause de la possibilité de tuer accidentellement plus que je ne le souhaite. Au lieu de cela, je quitte simplement le shell dans une fenêtre en utilisant ^ D (ou exit). La fenêtre d'écran se ferme automatiquement après avoir quitté le dernier shell d'une fenêtre.
Greg Hewgill

9
"^ Un esc - mode copie, que j'utilise pour faire défiler" Vous êtes un dieu parmi les hommes, monsieur.
Rob Howard

4
^ A [fait exactement la même chose.
atx

Merci pour ^ A ^ D truc ... J'étais coincé et je n'ai pas pu reprendre ma session. Au cas où cela aiderait quelqu'un, j'ai écrit un article il y a quelque temps qui explique la base des écrans comme ici mais qui contient quelques astuces supplémentaires geekpad.ca/blog/post
Patrick Forget

36

Je ne pouvais pas m'habituer à l'écran jusqu'à ce que je trouve un moyen de définir une `` barre d'état '' en bas de l'écran qui montre quel `` onglet '' ou `` écran virtuel '' vous êtes et quels autres sont. Voici ma configuration:

[roel@roel ~]$ cat .screenrc
# Here comes the pain...
caption always "%{=b dw}:%{-b dw}:%{=b dk}[ %{-b dw}%{-b dg}$USER%{-b dw}@%{-b dg}%H %{=b dk}] [ %= %?%{-b dg}%-Lw%?%{+b dk}(%{+b dw}%n:%t%{+b dk})%?(%u)%?%{-b dw}%?%{-b dg}%+Lw%? %{=b dk}]%{-b dw}:%{+b dw}:"

backtick 2 5 5 $HOME/scripts/meminfo
hardstatus alwayslastline "%{+b dw}:%{-b dw}:%{+b dk}[%{-b dg} %0C:%s%a %{=b dk}]-[   %{-b dw}Load%{+b dk}:%{-b dg}%l %{+b dk}] [%{-b dg}%2`%{+b dk}] %=[ %{-b dg}%1`%{=b dk} ]%{-b dw}:%{+b dw}:%<"

sorendition "-b dw"
[roel@roel ~]$ cat ~/scripts/meminfo
#!/bin/sh
RAM=`cat /proc/meminfo | grep "MemFree" | awk -F" " '{print $2}'`
SWAP=`cat /proc/meminfo | grep "SwapFree" | awk -F" " '{print $2}'`
echo -n "${RAM}kb/ram ${SWAP}kb/swap"
[roel@roel ~]$

3
Découvrez aussi byobu (profils d'écran): launchpad.net/byobu
Drew Stephens

C'est incroyable, merci. J'avais du mal à comprendre ce qui se passait réellement lorsque j'essayais de diviser mon terminal. Je ne savais pas que je devais exécuter screen en premier pour faire fonctionner l'une de ces commandes, idiot, je sais.
Ogaday

30

Ctrl+ A? - affichez l'écran d'aide!


Je suis complètement d'accord avec ça. C'est beaucoup plus utile que les autres réponses, puisque vous pouvez en déduire les autres commandes, mais vous ne pouvez pas le faire vice versa. De plus, il est beaucoup plus facile de se souvenir de la chose.
Léo Léopold Hertz 준영

26

Si votre ami a l'habitude d'appuyer sur ^Apour arriver au début de la ligne dans Bash, il / elle aura quelques surprises, car ^Ala touche de commande d'écran est contraignante. Habituellement, je me retrouve avec un écran gelé, peut-être à cause d'une touche aléatoire sur laquelle j'ai appuyé après ^A:-)

Dans ces cas j'essaye

^A set ^A qbloquer / débloquer le défilement du terminal

pour résoudre ce problème. Pour aller au début d'une ligne à l'intérieur de l'écran, la séquence de touches est ^A a.


1
Il est facile de changer le caractère d'échappement de ^ A en autre chose. J'ai mis les détails dans ma réponse.
Andrew Johnson

3
+ 1 + 1 + 1 ^ A s ... merci ... écran verrouillé :)
Yuji 'Tomita' Tomita

1
@agnul +1 pour vous pour ^ A a Je suis un utilisateur de ^ A dans une session bash normale et je ne peux pas l'utiliser dans une session écran. Merci pour le bon conseil! :)
icasimpan

Merci 100 fois à vous de m'avoir dit comment faire fonctionner le ctrl A à l'intérieur de l'écran. J'ai cherché ça toute ma vie.
user674669

Le «A» et «a» sont-ils sensibles à la casse ici?
Aditya MP

12

Vous pouvez remapper la touche d'échappement de Ctrl+ Apour être une autre clé de votre choix, donc si vous l'utilisez pour autre chose, par exemple pour aller au début de la ligne dans bash, il vous suffit d'ajouter une ligne à votre ~ /. fichier screenrc. Pour en faire ^ b ou ^ B, utilisez:

escape ^bB

À partir de la ligne de commande, utilisez les sessions de noms pour garder plusieurs sessions sous contrôle. J'utilise une session par tâche, chacune avec plusieurs onglets:

  screen -ls # Répertorie vos sessions d'écran actuelles
  screen -S <nom> # Crée une nouvelle session d'écran appelée nom
  screen -r <nom> # Se connecte aux sessions d'écran nommées

Lorsque vous utilisez screen, vous n'avez besoin que de quelques commandes:

  ^ A c Créer un nouveau shell
  ^ A [0-9] Interrupteur shell
  ^ A k Tuez le shell actuel
  ^ A d Déconnexion de l'écran
  ^ A? Montrez l'aide

Une excellente référence rapide peut être trouvée ici . Cela vaut la peine d'être mis en favori.


J'utilise des sessions d'écran imbriquées. Je commence l'extérieur avec screen -e^oopour pouvoir utiliser Ctrl + O pour cela, puis démarrer les internes avec screen -mpour qu'ils démarrent de nouvelles sessions.
staticsan

1
Vous pouvez changer la touche d'échappement à la volée. Dans une session d'écran en cours d'exécution, tapez ^A :suivi de \Bbsuivi de Entrée pour définir la touche d'échappement sur ^ B. En général, ^A :vous permet d'évaluer la commande que vous .screenrccomprenez.
malana

8

Quelques conseils pour ceux qui connaissent en quelque sorte screen, mais qui ont tendance à ne pas se souvenir des choses qu'ils lisent dans la page de manuel:

  • Changer le nom d'une fenêtre d'écran est très simple: ctrl+ A shift+ A.
  • Avez-vous manqué le dernier message de l'écran? ctrl+ a ctrl+ mle montrera à nouveau pour vous.
  • Si vous voulez exécuter quelque chose (comme la queue d'un fichier) et que l'écran vous indique quand il y a un changement, utilisez ctrl+ A shift+ msur la fenêtre cible. Attention: il vous permettra de savoir si quelque chose change.
  • Vous voulez sélectionner directement la fenêtre 15? Essayez-les dans votre .screenrcfichier:
bind  ! select 11
bind  @ select 12
bind \# select 13
bind  $ select 14
bind  % select 15
bind \^ select 16
bind  & select 17
bind  * select 18
bind  ( select 19
bind  ) select 10

Cela attribue ctrl+ a shift+ 0 through 9pour Windows 10 à 19.


7

Ctrl+ Aest la commande de base

Ctrl+ A N= aller à l'écran *** N *** ext

Ctrl+ A P= aller à l'écran *** P *** revious

Ctrl+ A C= *** C *** créer un nouvel écran

Ctrl+ A D= *** D *** attachez votre écran


6

http://www.debian-administration.org/articles/34

Je l'ai écrit il y a quelques années, mais c'est toujours une bonne introduction qui reçoit beaucoup de retours positifs.


Le lien est (effectivement) rompu:$VAR1 = \'Can\'t connect to local MySQL server through socket \'/var/run/mysqld/mysqld.sock\' (111 "Connection refused") at ../lib/Singleton/DBI.pm line 95. ';
Peter Mortensen le

6

Je "dois" ajouter ceci: ajouter

bind s

à votre .screenrc, si vous - comme moi - utilisé pour utiliser des fenêtres fractionnées, comme C-a Sdivise la fenêtre réelle, mais la C-a sfige. Je viens donc de désactiver le raccourci de gel.


2
^-Qse dégèle si vous frappez^-S
Platon

Vous avez raison @Plato. Je travaille toujours dans l'environnement avec des utilisateurs, qui ne mémoriseront presque aucun des raccourcis ... J'avais besoin de le désactiver.
Zsolt Botykai

NP Je viens de trouver ce fil en premier et j'ai cherché `` freeze '' et je n'ai pas trouvé ce que je cherchais
Platon

6

Ctrl+ aest une clé spéciale.

Ctrl+ a d- [d] etach, laissez les programmes (irssi?) en arrière-plan, rentrez chez vous.

Ctrl+ a c[c] créer une nouvelle fenêtre Ctrl+ a 0-9basculer entre les fenêtres par numéro

screen -r - retourne à la session détachée

Cela couvre 90% des cas d'utilisation. N'essayez pas d'afficher toutes les fonctionnalités en même temps.


Bien que, lorsque j'ai appris ce que screenje connais pour la première fois, j'étais confus sur ce que signifiait réellement détacher et rattacher un écran. Citation : "... vous pouvez avoir des tâches en cours d'exécution de longue durée dans des consoles séparées (comme ssh sur une machine à distance, des sessions IRC, ...) sur une machine donnée, vous déconnecter de la session, vous déplacer d'un emplacement physique à un autre, vous connecter à la machine via ssh et rattachez-la à la session écran pour continuer à travailler. "
JW.


3

La première modification que j'apporte à .screenrc est de changer la commande d'échappement. Comme beaucoup d'entre vous, je n'aime pas la séquence Ctrl-A par défaut en raison de son interférence avec cette fonctionnalité fondamentale dans presque tous les autres contextes. Dans mon fichier .screenrc, j'ajoute:

échapper `e

C'est backtick-e.

Cela me permet d'utiliser le backtick comme touche d'échappement (par exemple pour créer un nouvel écran, j'appuie sur backtick-c, detach is backtick-d, backtick-? Is help, backtick-backtick is previous screen, etc.). La seule façon dont cela interfère (et j'ai dû me débarrasser de cette habitude) est d'utiliser le backtick sur la ligne de commande pour capturer la sortie de l'exécution, ou de coller tout ce qui contient un backtick. Pour le premier, j'ai modifié mon habitude en utilisant la convention BASH $ (commande). Pour ce dernier, je viens généralement d'ouvrir un autre xterm ou de me détacher de l'écran puis de coller le contenu contenant le backtick. Enfin, si je souhaite insérer un backtick littéral, j'appuie simplement sur backtick-e.


brillant. J'utilise des backticks tout le temps, même si je sais que je devrais utiliser $ (...), alors maintenant je suppose que je devrai peut-être changer mes habitudes. Le backtick est un peu à l'écart, mais c'est bien d'avoir une seule touche sans modificateurs nécessaires. Mais pourquoi «e», et comment vous en souvenez-vous?
iconoclaste le

Je viens de tester 'escape' 'et cela fonctionne bien et semble plus facile à retenir. Si vous appuyez sur backtick et n'obtenez pas ce que vous attendez, il suffit de le frapper à nouveau.
iconoclaste le

J'ai fait cela, mais y a-t-il un moyen de taper un backtick à l'écran? Parfois, il faut le faire, et je déteste devoir me détacher pour le faire ...
Guillochon

@Guillouchon: le commentaire précédent explique exactement cela.
tripleee

3

Il y a un travail intéressant en cours pour obtenir une bonne configuration d'écran GNU par défaut dans la prochaine version d'Ubuntu Server, qui comprend l'utilisation du bas de l'écran pour afficher toutes les fenêtres ainsi que d'autres détails utiles sur la machine (comme le nombre de mises à jour disponible et si la machine a besoin d'un redémarrage). Vous pouvez probablement les saisir .screenrcet les personnaliser selon vos besoins.

Les commandes les plus utiles que j'ai dans mon .screenrcsont les suivantes:

shelltitle "$ |bash" # Make screen assign window titles automatically
hardstatus alwayslastline "%w" # Show all window titles at bottom line of term

De cette façon, je sais toujours quelles fenêtres sont ouvertes et ce qui s'y passe en ce moment également.


3

J'utilise ce qui suit pour ssh:

#!/bin/sh
# scr - Runs a command in a fresh screen
#
# Get the current directory and the name of command

wd=`pwd`
cmd=$1
shift

# We can tell if we are running inside screen by looking
# for the STY environment variable.  If it is not set we
# only need to run the command, but if it is set then
# we need to use screen.

if [ -z "$STY" ]; then
        $cmd $*
else
        # Screen needs to change directory so that
        # relative file names are resolved correctly.
        screen -X chdir $wd

        # Ask screen to run the command
        if [ $cmd == "ssh" ]; then
                screen -X screen -t ""${1##*@}"" $cmd $*
        else
                screen -X screen -t "$cmd $*" $cmd $*
        fi
fi

Ensuite, j'ai défini les alias bash suivants:

vim() {
        scr vim $*
}

man() {
        scr man $*
}

info() {
        scr info $*
}

watch() {
        scr watch $*
}

ssh() {
        scr ssh $*
}

Il ouvre un nouvel écran pour les alias ci-dessus et ssi en utilisant ssh, il renomme le titre de l'écran avec le nom d'hôte ssh.


2

J'aime mettre en place une session d'écran avec des noms descriptifs pour les fenêtres. ^ a A vous permettra de donner un nom à la fenêtre courante et ^ a "vous donnera une liste de vos fenêtres. Une fois terminé, détachez l'écran avec ^ ad et rattachez-le avec screen -R


1

J'aime utiliser screen -d -RRpour créer / attacher automatiquement à un écran donné. J'ai créé des fonctions bash pour vous faciliter la tâche ...

function mkscreen
{
    local add=n

    if [ "$1" == '-a' ]; then
        add=y
        shift;
    fi

    local name=$1;
    shift;
    local command="$*";

    if [ -z "$name" -o -z "$command" ]; then
        echo 'Usage: mkscreen [ -a ] name command

    -a          Add to .bashrc.' 1>&2;
        return 1;
    fi

    if [ $add == y ]; then
        echo "mkscreen $name $command" >> $HOME/.bashrc;
    fi

    alias $name="/usr/bin/screen -d -RR -S $name $command";

    return 0;
}

function rmscreen
{
    local delete=n

    if [ "$1" == '-d' ]; then
        delete=y
        shift;
    fi

    local name=$1;

    if [ -z "$name" ]; then
        echo 'Usage: rmscreen [ -d ] name

    -d          Delete from .bashrc.' 1>&2;
        return 1;
    fi

    if [ $delete == y ]; then
        sed -i -r "/^mkscreen $name .*/d" $HOME/.bashrc;
    fi

    unalias $name;

    return 0;
}

Ils créent un alias pour /usr/bin/screen -d -RR -S $name $command. Par exemple, j'aime utiliser irssi dans une session écran, donc dans mon .bashrc (sous ces fonctions), j'ai:

mkscreen irc /usr/bin/irssi

Alors je peux juste taper irc un terminal pour entrer dans irssi. Si l'écran 'irc' n'existe pas encore, il est créé et / usr / bin / irssi est exécuté à partir de celui-ci (qui se connecte automatiquement, bien sûr). S'il est déjà en cours d'exécution, je viens de le rattacher, en détachant de force toute autre instance qui y est déjà attachée. C'est assez sympa.

Un autre exemple est la création d'alias d'écran temporaires pour les perldocs au fur et à mesure que je les rencontre:

mkscreen perlipc perldoc perlipc
perlipc # Start reading the perldoc, ^A d to detach.
...
# Later, when I'm done reading it, or at least finished
# with the alias, I remove it.
rmscreen perlipc 

L'option -a (doit être le premier argument) ajoute l'alias d'écran à .bashrc (donc il est persistant) et -d le supprime (ceux-ci peuvent être potentiellement destructeurs, donc utilisez à vos risques et périls). xD

Ajouter:

Un autre bash-ism que je trouve pratique lorsque je travaille beaucoup avec écran:

alias sls='/usr/bin/screen -ls'

De cette façon, vous pouvez lister vos écrans avec beaucoup moins de frappes. Je ne sais pas s'il slsentre en collision avec des utilitaires existants, mais ce n'était pas le cas à l'époque sur mon système, alors je me suis lancé.



0

Ctrl+ Aest un super caractère spécial pour les gens d'Unix, mais si vous utilisez screen pour parler à OpenVMS , alors ne pas pouvoir ^ A vous rendra chauve prématurément.

Dans VMS , si vous éditez une commande DCL avant l'exécution à partir du tampon d'historique, le mode Insertion est désactivé (cela doit être pour quelques raisons que je n'entrerai pas ici) ... pour l'activer afin de ne pas Ne sur-tapez pas votre commande plutôt que d'espacer les choses, vous devez appuyer sur `^ A.


J'utilise screen -e ^Llpour des raisons similaires; Je ne peux tout simplement pas désapprendre à taper ctrl-A pour aller au début de la ligne dans Emacs. Heureusement, ctrl-L est une frappe dont j'ai rarement besoin, et à mon humble avis, il se connecte bien avec sa signification générale (redessiner / effacer l'écran).
tripleee

@tripleee: My .screenrchas escape ^@^@, qui utilise le caractère nul plutôt que control-A. Sur la plupart des systèmes, vous pouvez entrer le caractère nul comme espace de contrôle, ce qui est très facile à taper. (J'ai une session d'écran imbriquée qui s'exécute dans une fenêtre de ma session principale; pour celle-là, j'ai escape ^]^].)
Keith Thompson
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.