Was muss ich wissen, um GNU Screen richtig zu verwenden? [geschlossen]

106

Ich habe gerade einen Freund mit GNU Screen bekannt gemacht, und es fällt ihnen schwer, sich daran zu gewöhnen. Das lässt mich über die wesentlichen Dinge nachdenken, die er über das hervorragende Bildschirmdienstprogramm wissen muss , die gleichen Dinge, die Sie für sinnvoll halten würden, um jemanden, einen Anfänger, von Grund auf zu unterrichten. Was sind einige Analogien und nützliche Tipps zum Erinnern an Bindungen usw.?

Es wäre großartig.

Henry B.
quelle
1
Es gibt auch hier einige gute Antworten darauf: stackoverflow.com/questions/70661/what-is-gnu-screen
Chris
Jemand hat eine ähnliche Frage zu Server Fault gestellt .
Vagnerr
Wenn jemand gerade erst anfängt und Schwierigkeiten mit Screen hat, sollte er sich die alternative tmux ansehen .
Christopher Bottoms

Antworten:

93

Ich benutze Screenseit über 10 Jahren und benutze wahrscheinlich weniger als die Hälfte der Funktionen. Es ist also definitiv nicht notwendig, alle Funktionen sofort zu erlernen (und ich würde nicht empfehlen, es zu versuchen). Meine täglichen Befehle sind:

^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

Ich denke das ist es. Ich benutze manchmal die Split-Screen-Funktionen, aber sicher nicht täglich. Der andere Tipp ist, wenn der Bildschirm blockiert zu sein scheint, weil Sie versehentlich eine zufällige Tastenkombination gedrückt haben, tun Sie beides ^Qund ^A ^Qversuchen Sie, ihn zu entsperren.

Greg Hewgill
quelle
1
^ Ein k sollte zur Liste hinzugefügt werden, um ein Fenster zu schließen.
Léo Léopold Hertz 준영
7
Ich benutze ^ A k nicht wegen der Möglichkeit, versehentlich mehr zu töten, als ich beabsichtige. Stattdessen verlasse ich die Shell in einem Fenster einfach mit ^ D (oder exit). Das Bildschirmfenster wird automatisch geschlossen, nachdem die letzte Shell in einem Fenster verlassen wurde.
Greg Hewgill
9
"^ Ein Esc-Copy-Modus, den ich für den Scrollback verwende" Sie sind ein Gott unter Männern, Sir.
Rob Howard
4
^ A [macht genau das Gleiche.
atx
Danke für den Trick ^ A ^ D ... Ich steckte fest und konnte nicht zu meiner Sitzung zurückkehren. Für den Fall, dass dies jemandem hilft, habe ich vor einiger Zeit einen Artikel geschrieben, der die Grundlagen von Bildschirmen wie hier erklärt, aber noch ein paar Tricks enthält. Geekpad.ca/blog/post/…
Patrick Forget
36

Ich konnte mich nicht an den Bildschirm gewöhnen, bis ich eine Möglichkeit gefunden hatte, eine Statusleiste am unteren Bildschirmrand festzulegen, die anzeigt, auf welcher Registerkarte oder auf welchem ​​virtuellen Bildschirm Sie sich befinden und welche anderen es gibt. Hier ist mein Setup:

[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 ~]$
Roel
quelle
3
Schauen Sie sich auch byobu (Bildschirmprofile) an: launchpad.net/byobu
Drew Stephens
Das ist unglaublich, danke. Ich hatte Mühe herauszufinden, was tatsächlich geschah, als ich versuchte, mein Terminal aufzuteilen. Ich wusste nicht, dass ich zuerst den Bildschirm ausführen musste, damit einer dieser Befehle funktioniert, dumm, ich weiß.
Ogaday
30

Ctrl+ A? - Zeige den Hilfebildschirm!

James Muscat
quelle
Dem stimme ich voll und ganz zu. Dies ist viel nützlicher als andere Antworten, da Sie die anderen Befehle davon abziehen können, aber nicht umgekehrt. Es ist auch viel einfacher, sich an die Sache zu erinnern.
Léo Léopold Hertz 준영
26

Wenn Ihr Freund die Gewohnheit hat, zu drücken ^A, um in Bash an den Anfang der Zeile zu gelangen, wartet er auf einige Überraschungen, da ^Adie Bildschirmbefehlstaste gebunden ist. Normalerweise habe ich einen eingefrorenen Bildschirm, möglicherweise aufgrund einer zufälligen Taste, die ich nachher gedrückt habe ^A:-)

In diesen Fällen versuche ich es

^A sund ^A qBlockieren / Entsperren des Terminal-Bildlaufs

um das zu beheben. Um zum Anfang einer Zeile innerhalb des Bildschirms zu gelangen, lautet die Tastenfolge ^A a.

agnul
quelle
1
Es ist einfach, den Escape-Charakter von ^ A in etwas anderes zu ändern. Ich habe die Details in meine Antwort aufgenommen.
Andrew Johnson
3
+ 1 + 1 + 1 ^ A s ... danke ... gesperrter Bildschirm :)
Yuji 'Tomita' Tomita
1
@agnul +1 für Sie für ^ A a Ich bin ein Benutzer von ^ A in einer normalen Bash-Sitzung und kann es nicht in einer Bildschirmsitzung verwenden. Danke für den tollen Tipp! :)
icasimpan
Vielen Dank an Sie, dass Sie mir gesagt haben, wie ich Strg A auf dem Bildschirm zum Laufen bringen kann. Ich habe mein ganzes Leben lang danach gesucht.
user674669
Ist der Fall 'A' und 'a' hier sensibel?
Aditya MP
12

Sie können die Escape-Taste von Ctrl+ neu zuordnen, um Aeine andere Taste Ihrer Wahl zu sein. Wenn Sie sie also für etwas anderes verwenden, z. B. um in Bash an den Anfang der Zeile zu gelangen, müssen Sie Ihrem ~ / nur eine Zeile hinzufügen. screenrc Datei. Um es ^ b oder ^ B zu machen, benutze:

escape ^bB

Verwenden Sie in der Befehlszeile Namenssitzungen, um mehrere Sitzungen unter Kontrolle zu halten. Ich verwende eine Sitzung pro Aufgabe mit jeweils mehreren Registerkarten:

  screen -ls # Listet Ihre aktuellen Bildschirmsitzungen auf
  screen -S <Name> # Erstellt eine neue Bildschirmsitzung mit dem Namen name
  screen -r <Name> # Stellt eine Verbindung zu den benannten Bildschirmsitzungen her

Bei Verwendung des Bildschirms benötigen Sie nur wenige Befehle:

  ^ A c Erstellen Sie eine neue Shell
  ^ Eine [0-9] Switch-Shell
  ^ A k Töte die aktuelle Shell
  ^ A d Vom Bildschirm trennen
  ^ A? Zeigen Sie die Hilfe

Eine ausgezeichnete Kurzreferenz finden Sie hier . Es lohnt sich, ein Lesezeichen zu setzen.

Andrew Johnson
quelle
Ich verwende verschachtelte Bildschirmsitzungen. Ich beginne die äußere mit, screen -e^oodamit ich dafür Strg + O verwenden kann, und beginne dann die inneren mit, screen -mdamit sie neue Sitzungen starten.
Statik
1
Sie können die Escape-Taste im laufenden Betrieb ändern. In einer laufenden Bildschirmsitzung geben , ^A :gefolgt von \Bbgefolgt von Enter die Escape - Taste , um ^ B einzustellen. Im Allgemeinen ^A :können Sie Befehle auswerten, die Sie .screenrcverstehen.
Malana
8

Einige Tipps für diejenigen, die mit dem Bildschirm vertraut sind, sich aber nicht an Dinge erinnern, die sie auf der Manpage gelesen haben:

  • Das Ändern des Namens eines Bildschirmfensters ist sehr einfach: ctrl+ A shift+ A.
  • Haben Sie die letzte Nachricht vom Bildschirm verpasst? ctrl+ a ctrl+ mWird es zeigen wieder für Sie.
  • Wenn Sie etwas ausführen möchten (z. B. das Beenden einer Datei) und sich auf dem Bildschirm über Änderungen informieren möchten, verwenden Sie ctrl+ A shift+ mim Zielfenster. Warnung: Sie werden informiert, wenn sich etwas ändert.
  • Möchten Sie Fenster 15 direkt auswählen? Versuchen Sie diese in Ihrer .screenrcDatei:
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

Das weist ctrl+ a shift+ 0 through 9für Windows 10 bis 19 zu.

staticsan
quelle
7

Ctrl+ Aist der Basisbefehl

Ctrl+ A N= gehe zum *** N *** ext Bildschirm

Ctrl+ A P= gehe zum *** P *** Revious-Bildschirm

Ctrl+ A C= *** C *** neuer Bildschirm

Ctrl+ A D= *** D *** Befestigen Sie Ihren Bildschirm

Niko Gunadi
quelle
6

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

Ich habe das vor ein paar Jahren geschrieben, aber es ist immer noch eine gute Einführung, die viele positive Rückmeldungen erhält.


quelle
Die Verbindung ist (effektiv) unterbrochen:$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
6

Ich muss das hinzufügen: hinzufügen

bind s

zu Ihrem .screenrc, wenn Sie - wie ich - geteilte Fenster verwendet haben, um C-a Sdas eigentliche Fenster zu teilen , es aber C-a seinfrieren. Also habe ich gerade die Freeze-Verknüpfung deaktiviert.

Zsolt Botykai
quelle
2
^-QEntfriert, wenn Sie treffen^-S
Plato
Sie haben Recht @Plato. Trotzdem arbeite ich in einer Umgebung mit Benutzern, die sich fast keine der Verknüpfungen merken ... Ich musste sie deaktivieren.
Zsolt Botykai
NP Ich habe gerade diesen Thread zuerst gefunden und nach "Einfrieren" gesucht und nicht gefunden, wonach ich gesucht habe
Plato
6

Ctrl+ aist ein spezieller Schlüssel.

Ctrl+ a d- [d] etach, lass Programme (irssi?) im Hintergrund, gehe nach Hause.

Ctrl+ a c[c] ein neues Fenster erstellen Ctrl+ a 0-9zwischen Fenstern nach Nummer wechseln

screen -r - kehre zur getrennten Sitzung zurück

Das deckt 90% der Anwendungsfälle ab. Versuchen Sie nicht, alle Funktionen gleichzeitig anzuzeigen.

Tadeusz
quelle
Als ich zum ersten Mal davon erfuhr, war screenich verwirrt darüber, was es eigentlich bedeutete, einen Bildschirm abzunehmen und wieder anzubringen . Zitat : "... Sie können Aufgaben in verschiedenen Konsolen (wie ssh auf einem Remmote-Computer, IRC-Sitzungen usw.) auf einem bestimmten Computer ausführen, von der Sitzung trennen, von einem physischen Standort zu einem anderen wechseln und eine Verbindung herstellen die Maschine über ssh und erneut an die Bildschirmsitzung anschließen, um weiter zu arbeiten. "
JW.
3

Die erste Änderung, die ich an .screenrc vornehme, besteht darin, den Escape-Befehl zu ändern. Nicht anders als viele von Ihnen mag ich die Standard-Strg-A-Sequenz nicht, weil sie in fast jedem anderen Kontext diese grundlegende Funktionalität beeinträchtigt. In meiner .screenrc-Datei füge ich hinzu:

Flucht `e

Das ist Backtick-e.

Auf diese Weise kann ich den Backtick als Escape-Taste verwenden (z. B. um einen neuen Bildschirm zu erstellen, drücke ich Backtick-c, Trennen ist Backtick-d, Backtick-? Ist Hilfe, Backtick-Backtick ist vorheriger Bildschirm usw.). Die einzige Möglichkeit, die es stört (und ich musste mich von der Gewohnheit lösen), besteht darin, Backtick in der Befehlszeile zu verwenden, um die Ausführungsausgabe zu erfassen, oder alles einzufügen, das einen Backtick enthält. Für erstere habe ich meine Gewohnheit mithilfe der BASH $ (Befehl) -Konvention geändert. Für letzteres öffne ich normalerweise einfach ein anderes xterm oder entferne mich vom Bildschirm und füge dann den Inhalt ein, der den Backtick enthält. Wenn ich einen wörtlichen Backtick einfügen möchte, drücke ich einfach backtick-e.

Gary Chambers
quelle
brillant. Ich benutze die ganze Zeit Backticks, obwohl ich weiß, dass ich $ (...) verwenden sollte, also muss ich jetzt vielleicht meine Wege ändern. Der Backtick ist etwas abgelegen, aber es ist schön, einen einzigen Schlüssel ohne Modifikatoren zu haben. Aber warum "e" und wie erinnerst du dich daran?
Bilderstürmer
Ich habe gerade "Escape" getestet und es funktioniert gut und scheint leichter zu merken. Wenn Sie den Backtick drücken und nicht das bekommen, was Sie erwarten, drücken Sie ihn einfach erneut.
Bilderstürmer
Ich habe dies getan, aber gibt es eine Möglichkeit, einen Backtick auf dem Bildschirm einzugeben? Manchmal ist es notwendig, dies zu tun, und ich hasse es, mich
Guillochon
@ Guillouchon: Der vorherige Kommentar erklärt genau das.
Tripleee
3

In der nächsten Version von Ubuntu Server wird einige interessante Arbeit geleistet, um ein gutes GNU-Bildschirm-Setup zu erreichen. Dazu gehört, dass am unteren Bildschirmrand alle Fenster sowie andere nützliche Maschinendetails (wie die Anzahl der Updates) angezeigt werden verfügbar und ob der Computer einen Neustart benötigt). Sie können wahrscheinlich ihre greifen .screenrcund sie an Ihre Bedürfnisse anpassen.

Die nützlichsten Befehle, die ich in meinem habe, .screenrcsind die folgenden:

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

Auf diese Weise weiß ich immer, welche Fenster geöffnet sind und was gerade in ihnen läuft.

David Dean
quelle
3

Ich benutze folgendes für 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

Dann setze ich die folgenden Bash-Aliase:

vim() {
        scr vim $*
}

man() {
        scr man $*
}

info() {
        scr info $*
}

watch() {
        scr watch $*
}

ssh() {
        scr ssh $*
}

Es öffnet sich ein neuer Bildschirm für die oben genannten Aliase. Wenn Sie ssh verwenden, wird der Bildschirmtitel mit dem ssh-Hostnamen umbenannt.

Peter Mortensen
quelle
2

Ich möchte eine Bildschirmsitzung mit beschreibenden Namen für die Fenster einrichten. Mit ^ a A können Sie dem aktuellen Fenster einen Namen geben und mit ^ a "eine Liste Ihrer Fenster. Wenn Sie fertig sind, trennen Sie den Bildschirm mit ^ ad und hängen Sie ihn erneut mit screen -R an

innaM
quelle
1

Ich verwende gerne, um screen -d -RRautomatisch einen bestimmten Bildschirm zu erstellen / an diesen anzuhängen. Ich habe Bash-Funktionen erstellt, um es einfacher zu machen ...

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;
}

Sie erstellen einen Alias ​​für /usr/bin/screen -d -RR -S $name $command. Zum Beispiel verwende ich irssi gerne in einer Bildschirmsitzung, also habe ich in meiner .bashrc (unter diesen Funktionen):

mkscreen irc /usr/bin/irssi

Dann kann ich einfach ircein Terminal eingeben, um in irssi zu gelangen. Wenn der Bildschirm 'irc' noch nicht existiert, wird er erstellt und / usr / bin / irssi wird darauf ausgeführt (was natürlich automatisch eine Verbindung herstellt). Wenn es bereits ausgeführt wird, füge ich es einfach wieder hinzu und entferne zwangsweise jede andere Instanz, die bereits daran angehängt ist. Es ist ganz nett.

Ein weiteres Beispiel ist das Erstellen temporärer Bildschirm-Aliase für Perldocs, wenn ich auf sie stoße:

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 

Die Option -a (muss das erste Argument sein) hängt den Bildschirmalias an .bashrc an (damit er dauerhaft ist) und -d entfernt ihn (diese können möglicherweise destruktiv sein, daher auf eigenes Risiko verwenden). xD

Anhängen:

Ein weiterer Bash-Ismus, den ich praktisch finde, wenn ich viel mit dem Bildschirm arbeite:

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

Auf diese Weise können Sie Ihre Bildschirme mit viel weniger Tastenanschlägen auflisten. Ich weiß nicht, ob es slsmit vorhandenen Dienstprogrammen kollidiert, aber es war zu diesem Zeitpunkt auf meinem System nicht der Fall, also habe ich mich dafür entschieden.

Bambams
quelle
0

^ AA wechselt zurück zu dem Bildschirm, von dem Sie gerade gekommen sind.

Dummy
quelle
2
^ A ^ A wechselt zurück, ^ AA ermöglicht das Umbenennen des Fenstertitels.
Andrey Starodubtsev
0

Ctrl+ Aist eine großartige Sonderfigur für Unix-Benutzer, aber wenn Sie den Bildschirm verwenden, um mit OpenVMS zu sprechen , werden Sie vorzeitig kahl nicht in der Lage sind, ^ A zu verwenden.

Wenn Sie in VMS einen DCL- Befehl vor der Ausführung aus dem Verlaufspuffer bearbeiten , ist der Einfügemodus deaktiviert (dies muss aus einigen Gründen geschehen, auf die ich hier nicht eingehen werde) ... um ihn einzuschalten, damit Sie ihn nicht aktivieren Wenn Sie Ihren Befehl nicht übertippen, anstatt Dinge auszuräumen, müssen Sie `^ A drücken.

user2146463
quelle
Ich benutze screen -e ^Llaus ähnlichen Gründen; Ich kann es einfach nicht verlernen, Strg-A einzugeben, um zum Zeilenanfang in Emacs zu gelangen. Glücklicherweise ist Strg-L ein Tastenanschlag, den ich selten brauche, und es verbindet sich meiner Meinung nach gut mit seiner allgemeinen Bedeutung (Neuzeichnen / Löschen des Bildschirms).
Tripleee
@tripleee: Mein .screenrchas escape ^@^@, das das Nullzeichen anstelle von control-A verwendet. Auf den meisten Systemen können Sie das Nullzeichen als Kontrollraum eingeben, was sehr einfach einzugeben ist. (Ich habe eine verschachtelte Bildschirmsitzung in einem Fenster in meiner Hauptsitzung; für diese habe ich escape ^]^].)
Keith Thompson