Cosa devo sapere per usare correttamente GNU Screen? [chiuso]


106

Ho appena presentato a un amico GNU Screen e loro hanno difficoltà ad abituarsi. Questo mi fa pensare alle cose essenziali che ha bisogno di sapere sull'eccellente utility Screen , le stesse cose che penseresti valesse la pena insegnare a qualcuno, un principiante, da zero. Quali sono alcune analogie e suggerimenti utili per ricordare i legami, ecc.?

Sarebbe fantastico.


1
Ci sono alcune buone risposte a questo anche qui: stackoverflow.com/questions/70661/what-is-gnu-screen
Chris

Qualcuno ha pubblicato una domanda simile a questa su Server Fault .
Vagnerr

Se qualcuno ha appena iniziato e ha difficoltà con Screen, potrebbe voler controllare il tmux alternativo .
Christopher Bottoms

Risposte:


93

Lo uso Screenda oltre 10 anni e probabilmente uso meno della metà delle funzionalità. Quindi non è assolutamente necessario imparare subito tutte le sue funzionalità (e non consiglierei di provarlo). I miei comandi quotidiani sono:

^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

Penso che sia tutto. A volte utilizzo le funzionalità dello schermo diviso, ma certamente non tutti i giorni. L'altro suggerimento è se lo schermo sembra essersi bloccato perché hai premuto accidentalmente una combinazione di tasti casuale, fai entrambe le cose ^Qe ^A ^Qprova a sbloccarlo.


1
^ Una k dovrebbe essere aggiunta all'elenco per chiudere una finestra.
Léo Léopold Hertz 준영

7
Non uso ^ A k a causa della possibilità di uccidere accidentalmente più di quanto intendo. Invece, esco dalla shell in una finestra usando ^ D (o exit). La finestra dello schermo si chiude automaticamente dopo essere usciti dall'ultima shell in una finestra.
Greg Hewgill

9
"^ Una modalità esc - copia, che uso per lo scrollback" Sei un dio tra gli uomini, signore.
Rob Howard

4
^ A [fa esattamente la stessa cosa.
atx

Grazie per il trucco ^ A ^ D ... Ero bloccato e non potevo tornare alla mia sessione. Nel caso in cui questo aiuti qualcuno, ho scritto un articolo tempo fa che spiega le basi di schermate come qui ma ha qualche altro trucco geekpad.ca/blog/post/…
Patrick Forget

36

Non potevo abituarmi allo schermo finché non ho trovato un modo per impostare una "barra di stato" nella parte inferiore dello schermo che mostra quale "scheda" o "schermo virtuale" ti trovi e quali altri ci sono. Ecco la mia configurazione:

[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
Dai un'occhiata anche a byobu (screen-profiles): launchpad.net/byobu
Drew Stephens

È fantastico, grazie. Stavo lottando per capire cosa stesse realmente accadendo quando stavo cercando di dividere il mio terminale. Non mi rendevo conto che avevo bisogno di eseguire prima lo schermo per far funzionare qualcuno di questi comandi, sciocco, lo so.
Ogaday

30

Ctrl+ A? - mostra la schermata di aiuto!


Sono completamente d'accordo. Questo è molto più utile di altre risposte, poiché puoi dedurre gli altri comandi da esso, ma non puoi farlo viceversa. Inoltre è molto più facile ricordare la cosa.
Léo Léopold Hertz 준영

26

Se il tuo amico ha l'abitudine di premere ^Aper arrivare all'inizio della riga in Bash, avrà delle sorprese, poiché ^Aè il collegamento dei tasti di comando sullo schermo. Di solito mi ritrovo con uno schermo bloccato, forse a causa di qualche tasto casuale che ho premuto dopo ^A:-)

In quei casi ci provo

^A se ^A qblocca / sblocca lo scorrimento del terminale

per risolverlo. Per andare all'inizio di una riga all'interno dello schermo, la sequenza di tasti è ^A a.


1
È facile cambiare il carattere di escape da ^ A a qualcos'altro. Ho inserito i dettagli nella mia risposta.
Andrew Johnson,

3
+ 1 + 1 + 1 ^ A s ... grazie ... schermo bloccato :)
Yuji 'Tomita' Tomita

1
@agnul +1 per te per ^ A a Sono un utente di ^ A in una normale sessione di bash e non posso usarlo all'interno di una sessione dello schermo. Grazie per l'ottimo suggerimento! :)
icasimpan

Grazie 100 volte a te per avermi detto come far funzionare ctrl A all'interno dello schermo. Ho cercato questo per tutta la vita.
user674669

La "A" e la "a" fanno distinzione tra maiuscole e minuscole?
Aditya MP

12

Puoi rimappare la chiave di uscita da Ctrl+ Aper essere un'altra chiave di tua scelta, quindi se la usi per qualcos'altro, ad esempio per andare all'inizio della riga in bash, devi solo aggiungere una riga al tuo ~ /. file screenrc. Per renderlo ^ b o ^ B, usa:

escape ^bB

Dalla riga di comando, usa i nomi delle sessioni per tenere sotto controllo più sessioni. Uso una sessione per attività, ciascuna con più schede:

  screen -ls # Elenca le sessioni correnti dello schermo
  screen -S <name> # Crea una nuova sessione dello schermo chiamata name
  screen -r <nome> # Si collega alle sessioni dello schermo nominate

Quando si utilizza lo schermo sono necessari solo alcuni comandi:

  ^ A c Crea una nuova shell
  ^ A [0-9] Cambia shell
  ^ A k Uccidi la shell corrente
  ^ A d Disconnetti dallo schermo
  ^ A? Mostra l'aiuto

Un eccellente riferimento rapido può essere trovato qui . Vale la pena aggiungere un segnalibro.


Uso sessioni di schermo annidate. Inizio quello esterno con screen -e^oocosì posso usare Ctrl + O per quello e poi inizio quello interno con in screen -mmodo che inizino nuove sessioni.
staticsan

1
Puoi cambiare la chiave di uscita al volo. In una sessione della schermata in esecuzione, digitare ^A :seguito da \Bbseguito da Invio per impostare il tasto di uscita su ^ B. In generale, ^A :ti consente di valutare un comando che .screenrccapisci.
malana

8

Alcuni suggerimenti per coloro che hanno familiarità con lo schermo, ma tendono a non ricordare le cose che hanno letto nella pagina man:

  • Modificare il nome di una finestra dello schermo è molto semplice: ctrl+ A shift+ A.
  • Ti sei perso l'ultimo messaggio dallo schermo? ctrl+ a ctrl+ te mlo mostrerà di nuovo.
  • Se vuoi eseguire qualcosa (come la coda di un file) e avere lo schermo che ti dice quando c'è una modifica, usa ctrl+ A shift+ msulla finestra di destinazione. Attenzione: ti farà sapere se qualcosa cambia.
  • Vuoi selezionare direttamente la finestra 15? Prova questi nel tuo .screenrcfile:
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

Questo assegna ctrl+ a shift+ 0 through 9per le finestre da 10 a 19.


7

Ctrl+ Aè il comando di base

Ctrl+ A N= vai alla schermata *** N *** ext

Ctrl+ A P= vai alla schermata *** P *** revious

Ctrl+ A C= *** C *** crea una nuova schermata

Ctrl+ A D= *** D *** attacca lo schermo


6

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

L'ho scritto un paio di anni fa, ma è comunque una buona introduzione che riceve molti feedback positivi.


Il collegamento è (effettivamente) interrotto:$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 il

6

"Devo" aggiungere questo: aggiungi

bind s

al tuo .screenrc, se Tu - come me - usavi finestre divise, in quanto C-a Sdivide la finestra attuale, ma la C-a scongela. Quindi ho appena disabilitato la scorciatoia di blocco.


2
^-Qsi sblocca se colpisci^-S
Plato

Hai ragione @Plato. Sto ancora lavorando in un ambiente con utenti, che non memorizzeranno quasi nessuna delle scorciatoie ... Avevo bisogno di disabilitarlo.
Zsolt Botykai

NP ho appena trovato prima questo thread e ho cercato 'congelare' e non ho trovato quello che stavo cercando
Plato

6

Ctrl+a è una chiave speciale.

Ctrl+a d - [d] etach, lascia i programmi (irssi?) in sottofondo, torna a casa.

Ctrl+ a c[c] crea una nuova finestra Ctrl+a 0-9 passa da all'altra in base al numero

screen -r - torna alla sessione scollegata

Questo copre il 90% dei casi d'uso. Non cercare di mostrare tutte le funzionalità in una sola volta.


Tuttavia, quando ho saputo per la prima volta screenero confuso su cosa significasse effettivamente staccare e ricollegare uno schermo. Citazione : "... puoi avere attività in esecuzione a lungo in console separate (come ssh su una macchina remota, sessioni IRC, ...) su una determinata macchina, scollegarti dalla sessione, spostarti da una posizione fisica a un'altra, connettersi a la macchina tramite ssh e ricollegarsi alla sessione dello schermo per continuare a lavorare. "
JW.


3

La prima modifica che apporto a .screenrc è cambiare il comando di escape. Non diversamente da molti di voi, non mi piace la sequenza Ctrl-A predefinita a causa della sua interferenza con quella funzionalità fondamentale in quasi tutti gli altri contesti. Nel mio file .screenrc, aggiungo:

fuga '' e

Questo è backtick-e.

Questo mi permette di usare il backtick come tasto di uscita (es. Per creare un nuovo schermo, premo backtick-c, detach è backtick-d, backtick-? È di aiuto, backtick-backtick è lo schermo precedente, ecc.). L'unico modo in cui interferisce (e ho dovuto rompere l'abitudine) è usare il backtick sulla riga di comando per catturare l'output dell'esecuzione o incollare qualsiasi cosa che contenga un backtick. Per il primo, ho modificato la mia abitudine usando la convenzione BASH $ (comando). Per quest'ultimo, di solito apro semplicemente un altro xterm o mi stacco dallo schermo, quindi incollo il contenuto contenente il backtick. Infine, se desidero inserire un backtick letterale, premo semplicemente backtick-e.


brillante. Uso sempre i backtick, anche se so che dovrei usare $ (...), quindi ora immagino che dovrei cambiare i miei modi. Il backtick è un po 'fuori mano, ma è bello avere una sola chiave senza modificatori necessari. Ma perché "e", e come te lo ricordi?
iconoclasta

Ho appena provato 'fuga' 'e funziona bene e sembra più facile da ricordare. Se premi il backtick e non ottieni quello che ti aspetti, premi di nuovo.
iconoclasta

L'ho fatto, ma c'è un modo per digitare effettivamente un backtick mentre si è sullo schermo? A volte, è necessario farlo, e odio dover staccare per farlo ...
Guillochon

@Guillouchon: il commento precedente spiega esattamente questo.
tripleee

3

C'è del lavoro interessante da fare per ottenere una buona configurazione dello schermo GNU che avviene di default nella prossima versione di Ubuntu Server, che include l'uso della parte inferiore dello schermo per mostrare tutte le finestre e altri dettagli utili della macchina (come il numero di aggiornamenti disponibile e se la macchina necessita di un riavvio). Probabilmente puoi .screenrcprenderli e personalizzarli in base alle tue esigenze.

I comandi più utili che ho nel mio .screenrcsono i seguenti:

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

In questo modo so sempre quali finestre sono aperte e anche cosa è in esecuzione in esse al momento.


3

Uso quanto segue per 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

Quindi ho impostato i seguenti alias bash:

vim() {
        scr vim $*
}

man() {
        scr man $*
}

info() {
        scr info $*
}

watch() {
        scr watch $*
}

ssh() {
        scr ssh $*
}

Apre una nuova schermata per gli alias di cui sopra e, se si usa ssh, rinomina il titolo della schermata con il nome host ssh.


2

Mi piace impostare una sessione dello schermo con nomi descrittivi per le finestre. ^ a A ti permetterà di dare un nome alla finestra corrente e ^ a "ti darà un elenco delle tue finestre. Al termine, stacca lo schermo con ^ ad e ricollegalo con lo schermo -R


1

Mi piace usare screen -d -RRper creare / allegare automaticamente a una determinata schermata. Ho creato funzioni bash per renderlo più facile ...

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

Creano un alias per /usr/bin/screen -d -RR -S $name $command. Ad esempio, mi piace usare irssi in una sessione sullo schermo, quindi nel mio .bashrc (sotto quelle funzioni), ho:

mkscreen irc /usr/bin/irssi

Quindi posso semplicemente digitare irc un terminale per entrare in irssi. Se la schermata "irc" non esiste ancora, viene creata e / usr / bin / irssi viene eseguita da essa (che si connette automaticamente, ovviamente). Se è già in esecuzione, mi ricollego semplicemente ad esso, staccando con la forza qualsiasi altra istanza che è già collegata ad esso. È piuttosto carino.

Un altro esempio è la creazione di alias di schermata temporanei per i perldoc quando li incontro:

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'opzione -a (deve essere il primo argomento) aggiunge l'alias dello schermo a .bashrc (quindi è persistente) e -d lo rimuove (questi possono essere potenzialmente distruttivi, quindi usali a tuo rischio). xD

Aggiungere:

Un altro bash-ism che trovo conveniente quando lavoro molto con lo schermo:

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

In questo modo puoi elencare le tue schermate con molte meno sequenze di tasti. Non so se slsentra in collisione con le utility esistenti, ma al momento non era sul mio sistema, quindi ci ho provato.



0

Ctrl+ Aè un grande personaggio speciale per le persone Unix, ma se stai usando screen per parlare con OpenVMS , non essere in grado di ^ A ti renderà calvo prematuramente.

In VMS , se stai modificando un comando DCL prima dell'esecuzione dal buffer della cronologia, la modalità di inserimento è disattivata (deve essere per alcuni motivi che non entrerò qui) ... per attivarla quindi non se digiti eccessivamente il comando anziché spaziare, devi premere "^ A.


Uso screen -e ^Llper ragioni simili; Semplicemente non posso disimparare a digitare ctrl-A per andare all'inizio della riga in Emacs. Fortunatamente, ctrl-L è una sequenza di tasti di cui ho raramente bisogno, e inoltre IMHO si collega bene con il suo significato generale (ridisegna / cancella schermo).
tripleee

@ tripleee: My .screenrchas escape ^@^@, che utilizza il carattere null anziché control-A. Sulla maggior parte dei sistemi, puoi inserire il carattere null come spazio di controllo, che è molto facile da digitare. (Ho una sessione di schermo nidificata in esecuzione all'interno di una finestra nella mia sessione principale; per quella che ho escape ^]^].)
Keith Thompson
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.