Учимся использовать screen

Эта запись опубликована в рубрике [ FreeBSD, Линукс ]

Вы залогинились на ваш удаленный сервер через ssh, радостно стучите по клавиатуре, делая свои какие-то админские дела и опа! Символы перестали печатться и вывалилось то самое сообщение, которое, порой, вызывает непреодолимое желание разбить клавиатуру. Connection closed. Знакомая ситуация? Да-да, ваша сессия только что аварийно оборвалась и все придется делать заново… Этого можно избежать, если использовать screen. Он не только позволит сохранить вашу сессию в целости и сохранности, но еще и позволит держать открытыми несколько сессий в одном окошке терминала

Что такое screen?

Сначала посмотрим man-страницу: “Screen – это полноэкранный оконный менеджер, который позволяет разделить физический терминал между несколькими независимыми процессами (обычно интерактивными облочками)”.
У screen есть несколько отличительных особенностей, которые могут сильно помочь при выполнении задач на удаленных серверах через ssh. Я расскажу о трех, самых часто используемых мной фичах: многооконность, логирование и сессии. За более подробными деталями придется обратиться к man-странице.

Установка screen

Скорее всего, screen уже есть в вашей системе. Проверить это можно командой

$ which screen

Если which не дал результатов, то установите screen при помощи пакетного менеджера вашей системы. На моих серверах, в основном, CentOS и Debian, поэтому я ставлю screen так:

# yum install screen (для CentOS)
# apt-get install screen (для Debian)

Попадается и FreeBSD, в этом случае я использую порты:

# cd /usr/ports/sysutils/screen
make install clean

Использование screen

Screen запускается из командной строки также, как и любое приложение :)

$ screen

Вы можете получить сообщение о том, что screen запущен, а можете и не получить… Зависит от вашей системы. Если вы не получили сообщения, то вы можете подумать, что ничего не произошло. Однако это не так. Вы уже внутри терминала, запущенного в screen. Это нормальный полнофункциональный шелл, за исключением нескольких специальных команд. Screen использует клавиатурную комбинацию Ctrl+A для подачи команд терминалам внутри себя. Попробуйте нажать Ctrl+A, а затем ?
Вы увидите примерно следующее:

Screen key bindings, page 1 of 2.

Command key: ^A Literal ^A: a

break ^B b lockscreen ^X x reset Z
clear C log H screen ^C c
colon : login L select ” ‘
copy ^[ [ meta a silence _
detach ^D d monitor M split S
digraph ^V next ^@ ^N sp n suspend ^Z z
displays * number N time ^T t
fit F only Q title A
flow ^F f other ^A vbell ^G
focus ^I pow_break B version v
help ? pow_detach D width W
history { } prev ^P p ^? windows ^W w
info i readbuf < wrap ^R r
kill K redisplay ^L l writebuf >
lastmsg ^M m remove X xoff ^S s
license , removebuf = xon ^Q q
[Press Space for next page; Return to end.]

Screen воспринимает командные клавиатурные комбинации после нажатия Ctrl+A. Вы можете изменить это поведение при помощи конфиг-файла $HOME/.screenrc

Многооконность

Screen, как и большинство оконных менеджеров, поддерживает работу с несколькими окнами. Это очень удобно для выполнения параллельных задач без открытия новых ssh-сессий. Например, у меня постоянно открыто четыре или пять сессий с несколькими задачами в каждой. Раньше мне бы пришлось открыть порядка 15 терминалов, логинов, сессий.. Утомительно, не так ли? Эти неудобства полностью решает screen. Теперь я вполне могу обойтись одним терминалом.

Новое окно открывается комбинацией клавиш “Ctrl+a c”. После нажатия вы увидите новый терминал с вашим приглашением в том же окне. При этом предыдущие окна также продолжают работать. Давайте попробуем: запустите screen и в нем top

Mem: 506028K av, 500596K used, 5432K free,
0K shrd, 11752K buff
Swap: 1020116K av, 53320K used, 966796K free
393660K cached

PID USER PRI NI SIZE RSS SHARE STAT %CPU %ME
6538 root 25 0 1892 1892 596 R 49.1 0.3
6614 root 16 0 1544 1544 668 S 28.3 0.3
7198 admin 15 0 1108 1104 828 R 5.6 0.2

Теперь откройте новое окно, нажав “Ctrl+a c”

[boombick@server ] $

Вернитесь обратно, нажав Ctrl+a n

Mem: 506028K av, 500588K used, 5440K free,
0K shrd, 11960K buff
Swap: 1020116K av, 53320K used, 966796K free
392220K cached

PID USER PRI NI SIZE RSS SHARE STAT %CPU %ME
6538 root 25 0 1892 1892 596 R 48.3 0.3
6614 root 15 0 1544 1544 668 S 30.7 0.3

top остался в прежнем состоянии. Вы можете создать несколько окон и переключаться между ними используя Ctrl+a n для переключения на следующеее окно и Ctrl+a p для переключения на предыдущее. При этом каждый запущенный процесс останется в рабочем состоянии.

Отключаемся от screen

Есть два способа отключиться от screen: первый – это просто разлогиниться. Вы можете использовать клавиатурную комбинацию Ctrl+a K или просто набрать exit. Этот способ “убьет” текущее окно, если у вас их несколько или совсем остановит screen.
Второй способ заключается в отсоединении. Этот способ оставляет текущий процесс запущенным и просто отключает вас от терминала. Например, если вы через ssh-сессию запускаете какой-то очень длительный процесс, не требующий вашего внимания, то вы можете просто отключиться от screen при помощи Ctrl+a d. Это вернет вас обратно в исходную оболочку. Все процессы, запучшенные в screen, при этом остаются работающими и вы можете подключиться к ним позже.

Подключение к сессии

Вы компилируете большую программу на удаленном сервере, используя screen. И конечно же, по законам Мэрфи, соединение обрывается по независящим от вас причинам. Не стоит впадать в панику, screen все сохранил :) Просто соединитесь с сервером еще раз и посмотрите запущеные под screen процессы при помощи

[root@server root]# screen -ls
There are screens on:
31619.ttyp2.server (Detached)
4731.ttyp2.server (Detached)
2 Sockets in /tmp/screens/S-root.

В этом примере запущено две screen-сессии. Для подключения к нужной из них используйте команду

[root@server root]#screen -r 31619.ttyp2.server

Просто используйте screen с флагом r и именем сессии для повторного подключения. Это очень удобно. Можно, например, запустить какой-то длительный процесс на работе и, вернувшись домой, продолжить контроль за его выполнением.

Логирование

Мне кажется очень важным порой сохранять полный лог своих действий. К счастью, screen легко с этим справляется. Просто активируйте логирование нажатием Ctrl+a H. Screen будет продолжать логирование на протяжении всего процесса работы. Бывает очень полезно вернуться назад и посмотреть порядок необходимых действий.

И еще немного…

Screen может вести мониторинг активности окна. Если вы качаете что-то большое, компилируете программу или просто выполняете длительный процесс, вы можете долгое время наблюдать пустой терминал без признаков активности. А процесс, тем временем, продолжает выполняться. Или, наоборот, смотреть на поток отладочной информации, ожидая окончания процесса. Для начала слежения перейдите в терминал, который вы хотите наблюдать и нажмите Ctrl+a M для слежения за активностью (сработает при появлении новой информации) или Ctrl+a _ для слежения за бездействием (сработает при прекращении поступления информации в терминал). Затем вы можете спокойно переключиться в другое окно или создать новое. При наступлении события, screen предупредит вас об этом сообщением с номером окна в заголовке терминала. Для быстрого переключения в это окно используйте Ctrl+a ” (это символ кавычки). Вы увидите список всех активных окон на данный момент. Для перехода в нудное можно использовать стрелки или просто набрать номер нужного окна. Для прекращения наблюдения перейдите в нужное окно и отмените мониторинг той же командой. Например, ядл прекращения наблюдения за активностью нажмите Ctrl+a M.

Источник: http://boombick.org/blog/posts/22

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Post to Twitter Post to Delicious Post to Facebook Post to MySpace Post to Ping.fm

Оценить эту запись:
1 звезда2 звезды3 звезды4 звезды5 звезд
Метки: [ , , ]
Вы можете следить за ответами к этой записи через RSS 2.0 feed. Вы можете оставить мнение, или трэкбэк с собственного сайта.

13 комментариев(я)

  • 28.11.2007 18:38, fddima сказал:

    Спасибо! Интересно и познавательно. :)

    PS: RDP не что подобное тоже делает, в том смысле что не убивает сессию, пока не сделаешь принудительный log off.

    • 29.11.2007 09:14, Silver Ghost сказал:

      RDP – это ж визуальное вроде, если ничего не путаю. Там трафа дофига. На GPRS канале его не поднимешь. :)

      • 29.11.2007 10:54, fddima сказал:

        Ну RDP это и не RAdmin, та и потом суть была не в этом. :)

        PS: А зачем на венде капец(тм) – не гуишная консоль? :)

        • 16.04.2008 18:57, d1em00n сказал:

          интересная статейка… Опробывал на своих серваках :) Очень актуально! Автору спасибос! :)

          • [...] Зачем оно нам надо, если есть прекрасная программа screen для фонового запуска процессов. Останавливаем работу [...]

            • 23.09.2008 07:12, Daemon сказал:

              А как сделать, чтобы в mc работали F3 и F4?

              • 24.09.2008 17:17, Silver Ghost сказал:

                Известный глюк. Как лечить не знаю, но попробуйте вместо F3 нажать F5 :) У меня срабатывало.

                • 20.01.2009 11:59, Igron сказал:

                  > А как сделать, чтобы в mc работали F3 и F4?

                  Оно не работает только в putty (и то, кажется, можно настроить).
                  Вместо F3 используйте Escape,3 или Alt+3.
                  Ну для F4 аналогично: Escape,4 или Alt+4.

                  • 17.02.2009 15:55, vovka сказал:

                    Новичок и пользуюсь FreeBSD на VDS. Использовать screen очень удобно, но сервера часто перегружаются. Как запустить screen (и ранее запущенные задачи) при перезагрузке сервера (если можно поподробнее).
                    Вопрос к “старому сисадмину” и другим знатокам.

                    • 04.06.2009 09:30, viktor6 сказал:

                      Уменя почемуто отказывается ставиться
                      server:/home/viktor# apt-get install screenЧтение списков пакетов… Готово
                      Построение дерева зависимостей
                      Чтение информации о состоянии… Готово
                      E: Не удалось найти пакет screen
                      server:/home/viktor#

                      • 04.06.2009 10:29, Silver Ghost сказал:

                        apt-get update
                        или у Вас не все репы подключены.

                      • 17.06.2009 14:45, mvalery сказал:

                        У нас несколько человек имеют доступ к одному серверу. Чтобы знать чьи сессии, мы их помечаем:

                        Запустить именованную сессию maxim
                        $ screen -S maxim -t maxim

                        Подключиться к именованной сессии maxim:
                        $ screen -RdS maxim

                        А вот так выглядят сессии:
                        $ screen -ls
                        There are screens on:
                        1703.maxim (Attached)
                        16281.ivan (Detached)
                        2 Sockets in /tmp/screens/S-admin.

                        maxim работает. Просит меня помочь. Я подсоединяюсь к его сессии:
                        $ screen -xS maxim
                        теперь мы оба видим одну консоль, видим что творится. Оба можем вводить команды с клавиатуры.
                        Затем комбинацей “Ctrl+a d” я покидаю сессию. maxim продолжает работать один.

                        • 23.01.2010 16:19, Vasilii сказал:

                          Спасибо ! Хорошая статья. Только мне сначала было неясно где же все таки запускать screen на стороне сервера или пользователя теперь ясно.  

                          (Обязательно)
                          (Обязательно, не публикуется)