суббота, 11 августа 2007 г.

screen tips

Многим часто приходится иметь дело с работой на удаленных серверах по ssh. При этом могут возникать самые разные проблемы с соединением и есть вероятность того что результат долгой и напряженной работы будет потерян из-за банального дисконнекта. Хорошо иметь возможность подключатся и отключатся от удаленных хостов, сохраняя терминальные сессии. В этом, а так же во многом другом может помочь почти "классическая" утилита screen. Скорее всего screen уже установлен на вашей linux-машине(если нет - самое время установить), и на серверах с которыми вы собираетесь работать.

Итак, начинаем работу. Запустить новый screen можно(как ни странно), просто командой screen без параметров:

diesel@debian:~$ screen

При этом, в зависимости от настроек screen в вашей системе либо просто появится приглашение шелла, либо "экран приветствия", нажав SPACE или ENTER в котором вы так же попадете в shell. Вроде бы ничего не обычного, кроме того что этот shell будет уже запущен "внутри" screen'а.

Для того чтобы выйти из screen'а(выйти а не отстоединится) достаточно выйти из всех открытых в нем оболочек, либо же нажать комбинацию клавиш Ctl-a \, и ответить "y" на вопрос "действительно ли вы хотите выйти".

Отсоединится от текущего скрина, не закрывая и не завершая сессии можно комбинацией Ctrl-a d.

Если на машине уже есть запущенная screen-сессия, и вы хотите подсоединится к ней, то
1) если сессия одна, достаточно просто команды:

diesel@debian:~$ screen -x

2) если сессий несколько, то:
посмотреть список запущенных screen'ов можно командой screen -ls:

diesel@debian:~$ screen -ls
There are screens on:
2762.pts-0.debian (Detached)
2743.pts-0.debian (Detached)
2 Sockets in /var/run/screen/S-diesel.

diesel@debian:~$

выбираем нужный нам screen, и присоединяемся к нему:

screen -x 2762.pts-0.debian

Названия сессий по-умолчанию малоинформативны - просто номера процессов, если есть желание запустить и использовать несколько screen-сессий для разных задач можно придумать более вменяемые названия. Придумываем название, затем запускаем новый screen вот таким образом:

diesel@debian:~$ screen -S "job1"

где job1 - это название нашей "именнованной" сессии. Теперь в -ls мы увидим гораздо более понятное:

diesel@debian:~$ screen -ls
There are screens on:
2762.pts-0.debian (Detached)
2795.job1 (Detached)
2743.pts-0.debian (Detached)
3 Sockets in /var/run/screen/S-diesel.

и сможем подсоединиться к сессии job1 просто указав ее имя:

diesel@debian:~$ screen -x job1


Как вы уже поняли, сессии сохраняются даже в то время когда вы отключны от сервера, и все что в них запущено продолжает выполнятся. Впрочем, на этом возможности screen'а не исчерпываются.
Иногда при работе по ssh очень хочется чтобы было открыто сразу несколько терминалов, при этом коннектится несколько раз облом - особенно если коннектится нужно через несколько серверов. В этом тоже может помочь screen. Просто нажмите Ctrl - a c и откроется еще один шелл. Перемещатся между открытыми шеллами можно либо через Ctrl - a <Цифра>, где <Цифра> - номер открытого шелла начиная с нуля, либо Ctrl - a n/Ctrl - a p - вперед назад. Получить список открытых "окон" - консолей(и переключится на нужную), можно комбинацией клавиш Ctrl - a "; чтобы задать нормальное имя(а не просто скучный "bash") для какого-нить окна, перейдите в него и нажмите Ctrl - a A (регистр имеет значение), затем в появившемся приглашении введите имя.
Если открыто несколько окон полезной может быть возможность следить за активностью в каком-то из них. Например если вы запустили "долгоиграющую" команду и интересно узнать когда она завершится. Переходим в окно с этой командой, жмем Ctrl - a m, видим надпись типа такой: "Window 0 (bash) is now being monitored for all activity". Когда что-то в окне изменится screen подаст звуковой сигнал, а в списке окон после номера появится символ "@".

Конфигурируется screen с помощью файла ~/.screenrc, в вашем домашнем каталоге. Например можно написать туда вот такую абракадабру:


caption always "%{= 45}%{+b w}Screen: %n | %h %=%t %c"
hardstatus alwayslastline "%-Lw%{= BW}%50>%n%f* %t%{-}%+Lw%<"

для того чтобы получить все время видимый список открытых окон, и другую полезную информацию внизу экрана.

Вот примерно так маленький и незаметный screen может существенно облегчить жизнь.