Инструменты пользователя

Инструменты сайта


screen

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

screen [2018/12/27 07:03] (текущий)
Строка 1: Строка 1:
 +====== Команды screen ======
  
 +{{htmlmetatags>​
 +metatag-description=(Screen — свободная консольная утилита-мультиплексор,​ предоставляющая пользователю доступ к нескольким сессиям в рамках одной сессии)
 +}}
 +
 +  * **screen** - терминальный [[мультиплексор]].
 +  * [[http://​help.ubuntu.ru/​wiki/​%D1%80%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D0%BE_ubuntu_server/​%D0%B4%D1%80%D1%83%D0%B3%D0%B8%D0%B5_%D0%BF%D0%BE%D0%BB%D0%B5%D0%B7%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F/​byobu|Byobu]] - делает screen более дружественными.
 +  $ man 1 screen
 +screen - используется для управления процессами. Одна из основных особенностей программы screen заключается в том, что она позволяет отсоединяться от долгоживущего процесса и вновь возвращаться к нему. Все, что необходимо для запуска процесса под управлением программы screen, - это поместить команду screen перед командой запуска долгоживущего процесса,​ а затем нажать комбинации клавиш **Ctrl+a, d**, чтобы отсоединиться от сеанса.
 +
 +В самом screen, почти все сочетания клавиш работают через комбинацию [ Ctrl+a ], то есть сначала нажимаете ее, а уже затем управляющую комбинацию,​ например,​ что-бы получить исчерпывающую информацию по всем сочетаниям клавиш,​ жмем: [ Ctrl+a, ? ] ( имейте в виду, комбинация [ Ctrl+a ], относится и к приведенным в списке сочетаниям ).
 +
 +**Сочетания клавиш:​**
 +<​file>​
 +F11 - Переключение между виртуальными терминалами,​ предыдущее окно.
 +F12 - Переключение между виртуальными терминалами,​ следующее окно.
 +Ctrl+a, Ctrl+C или с Запустить еще один терминал.
 +Ctrl+a, d Отсоединить screen от экрана,​ вернувшись в физическую консоль. Сам screen
 +при этом никуда не девается и висит в фоне, продолжая выполнять ваши задачи.
 +Ctrl+a, A Изменить название окна.
 +Ctrl+a, k Убить окно текущее окно терминала (попросит подтверждения).
 +Ctrl+a, \ Закрыть screen, все виртуальные терминалы будут при это убиты (попросит подтверждения).
 +</​file>​
 +
 +  * **screen и ssh**
 +Возможно,​ при работе через [[SSH]] вы сталкивались с проблемой обрыва соединения посреди работы с программой,​ из-за чего вы были вынуждены перезапустить её заново,​ чтобы досмотреть до конца её вывод. Именно поэтому я считаю,​ что для людей, подключающихся к удалённой машине более чем на минуту и выполняющих там более одной команды,​ жизненно необходимо использовать Screen или другой терминальный мультиплексор. И даже если вы как раз их тех, кто подключается на минутку и запускает только одну команду,​ всё равно Screen будет полезен. Используя Screen через SSH, вы сможете запустить команду,​ отсоединить сессию и отключиться от удалённой машины. Я рекомендую отсоединять
 +сессию до разрыва SSH-соединения,​ но Screen должен сделать это самостоятельно. Потом вы просто снова подключаетесь к удалённой сессии и получаете все данные,​ что программа успела вывести за это время.
 +====== .screenrc ======
 +После установки в каталоге /etc (/​usr/​local/​etc) появится общесистемный конфигурационный файл screenrc. Если нужно что-бы разные пользователи,​ могли запускать программу со своими настройками,​ просто скопируйте этот файл в домашнюю директорию юзера с именем .screenrc
 +<​file>​
 +$ nano ~/.screenrc
 +
 +# default windows
 +#
 +
 +# screen -t local 0
 +# screen -t mail 1 mutt
 +# screen -t 40 2 rlogin server
 +
 +# caption always "%3n %t%? @%u%?%? [%h]%?​%=%c"​
 +# hardstatus alwaysignore
 +
 +hardstatus alwayslastline "%Lw %c" # резервирует последнюю строку экрана под строку статуса
 +
 +screen -t mc # создает пустое окно с именем указанным после ключа -t
 +exec /usr/bin/mc # запукает программу в этом окне
 +
 +screen -t top   
 +exec /​usr/​bin/​top
 +
 +
 +select 0 # указывает номер окна, которое будет активным при запуске
 +</​file>​
 +====== Ссылки ======
 +
 +  * [[http://​vds-admin.ru/​freebsd/​screen-polnotsennyi-okonnyi-menedzher-dlya-terminala|Screen — полноценный оконный менеджер для терминала]]
 +  * [[http://​www.xakep.ru/​post/​52156/​default.asp?​print=true|GNU Screen и tmux: ключ к эффективному использованию консоли]]
 +====== Пример:​ top и mc запущены через screen ======
 +Например,​ запустим через screen утилиту top и mc ([[Midnight Commander]]). Этот пример одинаково работает,​ как для Linux, так и BSD систем.
 +  - Посмотрим список уже запущенных процессов через screen.<​file>​
 +# screen -ls
 +No Sockets found in /​tmp/​screens/​S-root.
 +</​file>​Запущенных программа нет.
 +  - Запускаем утилиту top:<​file>​
 +# screen top
 +</​file>​Жмем комбинации клавиш Ctrl+A D и возвращаемся в командную строку. Проверяем список процессов.<​file>​
 +# screen -ls
 +There are screens on:
 +        14178.ttyp0.mail2 ​      ​(Detached)
 +1 Sockets in /​tmp/​screens/​S-root.
 +</​file>​
 +  - Запускаем [[Midnight Commander]]<​file>​
 +# screen mc
 +</​file>​Жмем комбинации клавиш Ctrl+A и Ctrl+B. Проверяем список процессов.<​file>​
 +# screen -ls
 +There are screens on:
 +        14178.ttyp0.mail2 ​      ​(Detached)
 +        14185.ttyp0.mail2 ​      ​(Detached)
 +2 Sockets in /​tmp/​screens/​S-root.
 +</​file>​Чтобы вернуться к нужному нам процессу,​ выполним команду с ключем -r и укажем pid процесса. Присоединимся к процессу top:<​file>​
 +# screen -r 14178
 +</​file>​
 +<​note>​Если у нас через screen запущен только один процесс,​ для переключения на него достаточно выполнить команду "​screen -r", указывать pid процесса не нужно.</​note>​
 +====== Пример:​ скрипт запуска rtorrent через screen ======
 +
 +Ссылка на оригинал скрипта от разработчиков [[rtorrent]] [[http://​libtorrent.rakshasa.no/​raw-attachment/​wiki/​RTorrentCommonTasks/​|rtorrentInit]].
 +
 +<​code>​
 +#!/bin/sh
 +#############​
 +###<​Notes>###​
 +#############​
 +# This script depends on screen.
 +# For the stop function to work, you must set an
 +# explicit session directory using ABSOLUTE paths (no, ~ is not absolute) in your rtorrent.rc.
 +# If you typically just start rtorrent with just "​rtorrent"​ on the
 +# command line, all you need to change is the "​user"​ option.
 +# Attach to the screen session as your user with 
 +# "​screen -dr rtorrent"​. Change "​rtorrent"​ with srnname option.
 +# Licensed under the GPLv2 by lostnihilist:​ lostnihilist _at_ gmail _dot_ com
 +##############​
 +###</​Notes>###​
 +##############​
 +
 +#######################​
 +##Start Configuration##​
 +#######################​
 +# You can specify your configuration in a different file 
 +# (so that it is saved with upgrades, saved in your home directory,
 +# or whateve reason you want to)
 +# by commenting out/​deleting the configuration lines and placing them
 +# in a text file (say /​home/​user/​.rtorrent.init.conf) exactly as you would
 +# have written them here (you can leave the comments if you desire
 +# and then uncommenting the following line correcting the path/​filename ​
 +# for the one you used. note the space after the "​."​.
 +# . /​etc/​rtorrent.init.conf
 +
 +#Do not put a space on either side of the equal signs e.g.
 +# user = user 
 +# will not work
 +# system user to run as
 +user="​darkfire"​
 +
 +# the system group to run as, not implemented,​ see d_start for beginning implementation
 +# group=`id -ng "​$user"​`
 +
 +# the full path to the filename where you store your rtorrent configuration
 +config="​`su -c 'echo $HOME' $user`/​.rtorrent.rc"​
 +
 +# set of options to run with
 +options=""​
 +
 +# default directory for screen, needs to be an absolute path
 +base="​`su -c 'echo $HOME' $user`"​
 +
 +# name of screen session
 +srnname="​rtorrent"​
 +
 +# file to log to (makes for easier debugging if something goes wrong)
 +logfile="/​var/​log/​rtorrentInit.log"​
 +#######################​
 +###END CONFIGURATION###​
 +#######################​
 +PATH=/​usr/​bin:/​usr/​local/​bin:/​usr/​local/​sbin:/​sbin:/​bin:/​usr/​sbin
 +DESC="​rtorrent"​
 +NAME=rtorrent
 +DAEMON=$NAME
 +SCRIPTNAME=/​etc/​init.d/​$NAME
 +
 +checkcnfg() {
 +    exists=0
 +    for i in `echo "​$PATH"​ | tr ':'​ '​\n'​` ; do
 +        if [ -f $i/$NAME ] ; then
 +            exists=1
 +            break
 +        fi
 +    done
 +    if [ $exists -eq 0 ] ; then
 +        echo "​cannot find rtorrent binary in PATH $PATH" | tee -a "​$logfile"​ >&2
 +        exit 3
 +    fi
 +    if ! [ -r "​${config}"​ ] ; then 
 +        echo "​cannot find readable config ${config}. check that it is there and permissions are appropriate"​ | tee -a "​$logfile"​ >&2
 +        exit 3 
 +    fi 
 +    session=`getsession "​$config"​` ​
 +    if ! [ -d "​${session}"​ ] ; then
 +        echo "​cannot find readable session directory ${session} from config ${config}. check permissions"​ | tee -a "​$logfile"​ >&2
 +        exit 3
 +    fi
 +}
 +
 +d_start() {
 +  [ -d "​${base}"​ ] && cd "​${base}"​
 +  stty stop undef && stty start undef
 +  su -c "​screen -ls | grep -sq "​\.${srnname}[[:​space:​]]"​ " ${user} || su -c "​screen -dm -S ${srnname} 2>&1 1>/​dev/​null"​ ${user} | tee -a "​$logfile"​ >&2
 +  # this works for the screen command, but starting rtorrent below adopts screen session gid
 +  # even if it is not the screen session we started (e.g. running under an undesirable gid
 +  #su -c "​screen -ls | grep -sq "​\.${srnname}[[:​space:​]]"​ " ${user} || su -c "sg \"​$group\"​ -c \"​screen -fn -dm -S ${srnname} 2>&1 1>/​dev/​null\""​ ${user} | tee -a "​$logfile"​ >&2
 +  su -c "​screen -S "​${srnname}"​ -X screen rtorrent ${options} 2>&1 1>/​dev/​null"​ ${user} | tee -a "​$logfile"​ >&2
 +}
 +
 +d_stop() {
 +    session=`getsession "​$config"​`
 +    if ! [ -s ${session}/​rtorrent.lock ] ; then
 +        return
 +    fi
 +    pid=`cat ${session}/​rtorrent.lock | awk -F: '​{print($2)}'​ | sed "​s/​[^0-9]//​g"​`
 +    if ps -A | grep -sq ${pid}.*rtorrent ; then # make sure the pid doesn'​t belong to another process
 +        kill -s INT ${pid}
 +    fi
 +}
 +
 +getsession() { 
 +    session=`cat "​$1"​ | grep "​^[[:​space:​]]*session[[:​space:​]]*="​ | sed "​s/​^[[:​space:​]]*session[[:​space:​]]*=[[:​space:​]]*//"​ `
 +    echo $session
 +}
 +
 +checkcnfg
 +
 +case "​$1"​ in
 +  start)
 +    echo -n "​Starting $DESC: $NAME"
 +    d_start
 +    echo "​."​
 +    ;;
 +  stop)
 +    echo -n "​Stopping $DESC: $NAME"
 +    d_stop
 +    echo "​."​
 +    ;;
 +  restart|force-reload)
 +    echo -n "​Restarting $DESC: $NAME"
 +    d_stop
 +    sleep 1
 +    d_start
 +    echo "​."​
 +    ;;
 +  *)
 +    echo "​Usage:​ $SCRIPTNAME {start|stop|restart|force-reload}"​ >&2
 +    exit 1
 +    ;;
 +esac
 +
 +exit 0
 +</​code>​
загрузка...
screen.txt · Последние изменения: 2018/12/27 07:03 (внешнее изменение)