Что мне нужно знать, чтобы правильно использовать GNU Screen? [закрыто]


106

Я только что познакомил друга с GNU Screen, и ему трудно к нему привыкнуть. Это заставляет меня задуматься о важных вещах, которые ему нужно знать об отличной утилите Screen , о тех вещах, которым, по вашему мнению, стоит научить кого-то, новичка, с нуля. Какие есть аналогии и полезные советы по запоминанию биндов и т. Д.?

Это было бы замечательно.


1
Здесь также есть несколько хороших ответов на этот вопрос: stackoverflow.com/questions/70661/what-is-gnu-screen
— Крис,

Кто-то разместил аналогичный вопрос в Server Fault .
— Vagnerr

Если кто-то только начинает работать с Screen и испытывает трудности с ним, они могут захотеть проверить альтернативный tmux .
— Кристофер Боттомс,

Ответы:


93

Я использую Screenболее 10 лет и, вероятно, использую менее половины функций. Так что изучать сразу все его возможности определенно не обязательно (и я бы не рекомендовал пробовать). Мои повседневные команды:

^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

Думаю, все. Иногда я использую функции разделения экрана, но, конечно, не ежедневно. Другой совет: если кажется, что экран заблокирован из-за того, что вы случайно нажали какую-то случайную комбинацию клавиш, выполните оба действия ^Qи^A ^Q попытайтесь разблокировать его.


1
^ Чтобы закрыть окно, нужно добавить k в список.
— Лео Леопольд Герц 준영

7
Я не использую ^ A k из-за возможности случайно убить больше, чем собираюсь. Вместо этого я просто выхожу из оболочки в окне с помощью ^ D (или exit). Окно экрана автоматически закрывается после выхода из последней оболочки в окне.
— Грег Хьюгилл,

9
"^ Режим esc - копирования, который я использую для прокрутки назад" Вы бог среди людей, сэр.
— Роб Ховард

4
^ A [делает то же самое.
— atx

Спасибо за трюк ^ A ^ D ... Я застрял и не мог вернуться к сеансу. На случай, если это поможет кому-то, я недавно написал статью, в которой объясняются основы работы с экранами, как здесь, но есть еще несколько трюков geekpad.ca/blog/post/…
— Патрик Забыть

36

Я не мог привыкнуть к экрану, пока не нашел способ установить в нижней части экрана «строку состояния», которая показывает, на какой «вкладке» или «виртуальном экране» вы находитесь, а какие еще есть. Вот моя установка:

[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
Также обратите внимание на byobu (профили экранов): launchpad.net/byobu
— Дрю Стивенс

Это потрясающе, спасибо. Я изо всех сил пытался понять, что на самом деле происходит, когда я пытался разделить свой терминал. Я не понимал, что мне нужно сначала запустить screen, чтобы заставить любую из этих команд работать, я знаю, глупо.
— Огадай

30

Ctrl+ A? - показать экран справки!


Я полностью согласен с этим. Это гораздо более полезно, чем другие ответы, поскольку вы можете вычесть другие команды по нему, но вы не можете сделать это наоборот. Кроме того, это намного легче запомнить.
— Лео Леопольд Герц 준영

26

Если ваш друг имеет обыкновение нажимать, ^Aчтобы перейти к началу строки в Bash, его / ее ждут некоторые сюрпризы, так ^Aкак это привязка клавиши экранной команды. Обычно я получаю зависший экран, возможно, из-за какой-то случайной клавиши, которую я нажал после^A :-)

В этих случаях я стараюсь

^A s и ^A q заблокировать / разблокировать прокрутку терминала

чтобы исправить это. Для перехода к началу строки внутри экрана, ключевая последовательность ^A a.


1
Заменить escape-символ с ^ A на что-то другое легко. Я изложил подробности в своем ответе.
— Эндрю Джонсон,

3
+ 1 + 1 + 1 ^ A s ... спасибо ... заблокированный экран :)
— Yuji 'Tomita' Tomita

1
@agnul +1 для вас за ^ A a Я использую ^ A в обычном сеансе bash и не могу использовать его внутри сеанса экрана. Спасибо за отличный отзыв! :)
— icasimpan

100 раз спасибо за то, что рассказали мне, как заставить ctrl A работать внутри экрана. Искал это всю свою жизнь.
— user674669

Учитываются ли здесь регистр букв "A" и "a"?
— Aditya MP

12

Вы можете переназначить escape-клавишу с Ctrl+ Aна другую клавишу по вашему выбору, поэтому, если вы действительно используете ее для чего-то еще, например, чтобы перейти к началу строки в bash, вам просто нужно добавить строку в ваш ~ /. screenrc файл. Чтобы сделать это ^ b или ^ B, используйте:

escape ^bB

В командной строке используйте сеансы имен, чтобы контролировать несколько сеансов. Я использую один сеанс для каждой задачи, каждая с несколькими вкладками:

  screen -ls # Выводит список ваших текущих сеансов экрана
  screen -S <name> # Создает новый сеанс экрана с именем name
  screen -r <name> # Подключается к названным сеансам экрана

При использовании screen вам понадобится всего несколько команд:

  ^ A c Создать новую оболочку
  ^ A [0-9] Переключатель оболочки
  ^ A k Убить текущую оболочку
  ^ A d Отключиться от экрана
  ^ А? Показать помощь

Превосходный краткий справочник можно найти здесь . Стоит сделать закладку.


Я использую вложенные сеансы экрана. Я начинаю с внешнего, screen -e^ooпоэтому могу использовать для этого Ctrl + O, а затем начинаю с внутреннего, screen -mчтобы они запускали новые сеансы.
— staticsan

1
Вы можете изменить клавишу выхода на лету. Во время сеанса работы с экраном введите, ^A :а \Bbзатем нажмите Enter, чтобы установить для клавиши выхода значение ^ B. В общем, ^A :позволяет оценить команду, которую вы .screenrcпонимаете.
— malana

8

Несколько советов для тех, кто знаком с screen, но не помнит то, что читал на странице руководства:

  • Изменить название экранного окна очень просто: ctrl+ A shift+ A.
  • Вы пропустили последнее сообщение с экрана? ctrl+ a ctrl+ mпокажет вам это снова.
  • Если вы хотите что-то запустить (например, следить за файлом), и экран сообщит вам об изменениях, используйте ctrl+ A shift+ mв целевом окне. Предупреждение: он сообщит вам, если что-то изменится.
  • Хотите выбрать окно 15 напрямую? Попробуйте это в своем .screenrcфайле:
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

Это дает ctrl+ a shift+ 0 through 9для окон с 10 по 19.


7

Ctrl+ A- это базовая команда

Ctrl+ A N= перейти на экран *** N *** ext

Ctrl+ A P= перейти на предыдущий экран *** P ***

Ctrl+ A C= *** C *** создать новый экран

Ctrl+ A D= *** D *** etach your screen


6

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

Я написал это пару лет назад, но это все еще хорошее введение, которое получает много положительных отзывов.


Ссылка (фактически) не работает:$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. ';
— Питер Мортенсен

6

Я "должен" добавить это: добавить

bind s

к вашему .screenrc, если вы - как и я - использовали разделенные окна, так как C-a Sфактическое окно разбивается, но C-a sзамораживается. Поэтому я просто отключил ярлык замораживания.


2
^-Qразмораживается при ударе^-S
— Платон

Вы правы, @Plato. Тем не менее, я работаю в среде с пользователями, которые не запоминают почти ни один ярлык ... Мне нужно было отключить его.
— Zsolt Botykai

Н.П., я просто сначала нашел эту тему, искал 'freeze' и не нашел того, что искал
— Платон

6

Ctrl+ a- специальный ключ.

Ctrl+ a d- [d] etach, оставить программы (irssi?) в фоновом режиме, вернуться домой.

Ctrl+ a c[c] создать новое окно Ctrl+ a 0-9переключаться между окнами по номеру

screen -r - вернуться к отключенному сеансу

Это покрывает 90% случаев использования. Не пытайтесь показать весь функционал одновременно.


Хотя, когда я впервые узнал об этом, screenя был смущен тем, что на самом деле означает отсоединение и повторное прикрепление экрана. Цитата : «... у вас могут быть длительно выполняющиеся задачи на отдельных консолях (например, ssh на удаленном компьютере, сеансы IRC и т. Д.) На данном компьютере, отключаться от сеанса, перемещаться из одного физического места в другое, подключаться к машину через ssh и повторно подключитесь к сеансу экрана, чтобы продолжить работу ".
— JW.

4

Не очень важно, не только связано с экраном, но включение 256 цветов в моем терминале, GNU Screen и Vim значительно улучшили мой опыт работы с экраном (тем более, что я кодирую в Vim около 8 часов в день - есть несколько отличных удобных для глаз цветовых схем).


Спасибо! Это меня давно беспокоит.
— Дэн Голдштейн

3

Первая модификация, которую я внес в .screenrc, - это изменить команду escape. Как и многие из вас, мне не нравится последовательность Ctrl-A по умолчанию из-за того, что она мешает этой фундаментальной функции почти в любом другом контексте. В моем файле .screenrc я добавляю:

побег `е

Это обратная кавычка.

Это позволяет мне использовать обратную кавычку в качестве клавиши перехода (например, для создания нового экрана я нажимаю обратную кавычку-c, отсоединение - обратная кавычка-d, обратная кавычка-? - помощь, обратная кавычка - предыдущий экран и т. Д.). Единственный способ, которым это мешает (и мне пришлось избавиться от этой привычки), - это использовать обратную кавычку в командной строке для захвата результатов выполнения или вставлять все, что содержит обратную кавычку. Что касается первого, я изменил свою привычку, используя соглашение BASH $ (команда). Для последнего я обычно просто открываю другой xterm или отключаюсь от экрана, а затем вставляю контент, содержащий обратную кавычку. Наконец, если я хочу вставить буквальную обратную кавычку, я просто нажимаю обратную кавычку-e.


блестящий. Я все время использую обратные кавычки, хотя знаю, что мне следует использовать $ (...), так что теперь я думаю, что мне, возможно, придется изменить свой способ. Обратные кавычки немного в стороне, но хорошо иметь один ключ без необходимых модификаторов. Но почему именно «е» и как вы это запомнили?
— iconoclast

Я только что протестировал `` побег '', он отлично работает и кажется, что его легче запомнить. Если вы нажмете обратную кавычку и не получите того, чего ожидаете, просто нажмите еще раз.
— iconoclast

Я сделал это, но есть ли способ набрать обратную кавычку, находясь на экране? Иногда это необходимо, и я ненавижу отстраняться, чтобы сделать это ...
— Гильошон

@Guillouchon: предыдущий комментарий объясняет именно это.
— tripleee

3

Ведется некоторая интересная работа по получению хорошей настройки экрана GNU по умолчанию в следующей версии Ubuntu Server, которая включает использование нижней части экрана для отображения всех окон, а также других полезных сведений о машине (например, количество обновлений доступно и требуется ли перезагрузка машины). Вы, вероятно, можете взять их .screenrcи настроить под свои нужды.

Самые полезные команды, которые у меня .screenrcесть, следующие:

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

Таким образом, я всегда знаю, какие окна открыты и что в них работает в данный момент.


3

Я использую для 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

Затем я установил следующие псевдонимы bash:

vim() {
        scr vim $*
}

man() {
        scr man $*
}

info() {
        scr info $*
}

watch() {
        scr watch $*
}

ssh() {
        scr ssh $*
}

Он открывает новый экран для вышеуказанных псевдонимов и, если используется ssh, переименовывает заголовок экрана на имя хоста ssh.


2

Мне нравится настраивать сеанс экрана с описательными именами для окон. ^ a A позволит вам дать имя текущему окну, а ^ a "предоставит вам список ваших окон. Когда закончите, отсоедините экран с помощью ^ ad и повторно прикрепите с помощью screen -R


1

Мне нравится использовать screen -d -RRдля автоматического создания / прикрепления к заданному экрану. Я создал функции bash, чтобы было проще ...

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

Они создают псевдоним /usr/bin/screen -d -RR -S $name $command. Например, мне нравится использовать irssi в сеансе экрана, поэтому в моем .bashrc (под этими функциями) у меня есть:

mkscreen irc /usr/bin/irssi

Тогда я могу просто ввести irc терминал, чтобы войти в irssi. Если экран irc еще не существует, он создается и с него запускается / usr / bin / irssi (который, конечно, подключается автоматически). Если он уже запущен, я просто снова подключаюсь к нему, принудительно отсоединяя любой другой экземпляр, который уже подключен к нему. Это неплохо.

Другой пример - создание временных псевдонимов экрана для perldocs по мере их появления:

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 

Параметр -a (должен быть первым аргументом) добавляет псевдоним экрана к .bashrc (чтобы он был постоянным), а -d удаляет его (это потенциально может быть разрушительным, поэтому используйте его на свой страх и риск). xD

Добавить:

Еще один баш-изм, который мне удобен при длительной работе с экраном:

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

Таким образом вы сможете выводить список своих экранов с гораздо меньшим количеством нажатий клавиш. Я не знаю, slsсталкивается ли с какими-либо существующими утилитами, но в то время в моей системе этого не было, поэтому я пошел на это.



0

Ctrl+ A- отличный специальный персонаж для Unix-людей, но если вы используете экран для общения с OpenVMS , то неспособность ^ A сделает вас преждевременно лысым.

В VMS , если вы редактируете команду DCL перед выполнением из буфера истории, режим вставки отключен (это должно быть по нескольким причинам, я не буду здесь вдаваться) ... чтобы включить его, чтобы вы не Не набирайте команду слишком часто, а не разбрасывайтесь, вы должны нажать `^ A.


Пользуюсь screen -e ^Llпо тем же причинам; Я просто не могу отучиться набирать ctrl-A, чтобы перейти к началу строки в Emacs. К счастью, ctrl-L - это нажатие клавиши, которое мне редко нужно, и, кроме того, оно, IMHO, прекрасно сочетается со своим общим значением (перерисовка / очистка экрана).
— Tripleee

@tripleee: My .screenrchas escape ^@^@, в котором используется нулевой символ, а не control-A. В большинстве систем вы можете ввести нулевой символ в качестве контрольного пробела, который очень легко набрать. (У меня есть вложенный сеанс экрана, работающий внутри окна в моем основном сеансе; для этого у меня есть escape ^]^].)
— Кейт Томпсон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.