Как составить список сеансов экрана?

180

У меня есть группа серверов, на которых я запускаю эксперименты с помощью screen. Процедура следующая:

  • ssh на сервер XXX
  • запуск screen
  • начать эксперименты на нескольких вкладках
  • отсоединить screen
  • отключиться от сервера

Во время выполнения экспериментов я могу легко найти, на каких серверах они находятся на ssh для всех серверов и перечислены мои запущенные процессы (используя top или ps).

Однако, как только эксперименты закончены, как я могу найти, на каких серверах у меня открыта сессия экрана (чтобы я мог посмотреть на результат, перезапустить их и т.д.)?

PS: мои эксперименты также печатают выходные данные в файлах... но это не вопрос моего вопроса.

Теги:
command-line
gnu-screen

8 ответов

287
Лучший ответ

Чтобы просмотреть все сеансы экрана для пользователя, выполните следующую команду в качестве этого пользователя:

screen -ls

Чтобы просмотреть все сеансы экрана на определенном компьютере, вы можете:

ls -laR /var/run/screen/

Я получаю это на своей машине:

gentle ~ # ls -laR /var/run/screen/

/var/run/screen/:
total 1
drwxrwxr-x  4 root utmp   96 Mar  1  2005 .
drwxr-xr-x 10 root root  840 Feb  1 03:10 ..
drwx------  2 josh users  88 Jan 13 11:33 S-josh
drwx------  2 root root   48 Feb 11 10:50 S-root

/var/run/screen/S-josh:
total 0
drwx------ 2 josh users 88 Jan 13 11:33 .
drwxrwxr-x 4 root utmp  96 Mar  1  2005 ..
prwx------ 1 josh users  0 Feb 11 10:41 12931.pts-0.gentle

/var/run/screen/S-root:
total 0
drwx------ 2 root root 48 Feb 11 10:50 .
drwxrwxr-x 4 root utmp 96 Mar  1  2005 ..

Это довольно яркое использование Unix для Unix Sockets, завернутых в разрешения файловой системы для управления безопасностью, состоянием и потоками.

  • 0
    Интересно, почему этот ответ, который отлично ответил на вопрос, получил отрицательное голосование ...
  • 0
    В качестве альтернативы, если вы хотите получить конкретный экран, основанный на соглашении об именах, вы можете получить результат. ls -R /var/run/screen/S-root/ | grep "NamingConvention" . Экраны сохраняются в формате <pid>.<screen_name> . Это полезно для скриптов bash. Поэтому, если у вас есть экран с именем 0000.NamingConvention он буквально просто вернет название экранов, которые вы ищете, в удобном для анализа формате.
18

Команда screen -list может быть тем, что вы хотите.

Смотрите man

12

В то время как ответ joshperry правильный, я нахожу очень раздражающим, что он не сообщает вам имя экрана (тот, который вы задали с опцией -t), это на самом деле то, что вы используете для идентификации сеанса. (не его вина, конечно, что недостаток экрана)

Вот почему я вместо этого использую script, например: ps auxw|grep -i screen|grep -v grep

  • 0
    Первый вариант, screen -ls, показывает имена
  • 0
    @ Qwerty01 это не показывает имена для меня: /
Показать ещё 1 комментарий
5
 For windows system

 Open putty 
 then login in server

Если вы хотите видеть экран в консоли, вам нужно написать команду

 Screen -ls

если вам нужно получить доступ к экрану, вы должны использовать команду ниже

 screen -x screen id

Напишите PWD в командной строке, чтобы проверить, в какой папке вы находитесь в настоящее время

4

Я не уверен в вашем вопросе, но если все, что вам действительно нужно, это список открытых сеансов экрана, попробуйте:

screen -ls
  • 0
    Нет проблем ... Он это заслужил: P. Рад, что вы нашли то, что хотели.
3

В большинстве случаев a screen -RRx $username/ будет достаточно:)

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

#!/bin/bash
if [[ "$1" != "-ls-all" ]]; then
    exec /usr/bin/screen "$@"
else
    shopt -s nullglob
    screens=(/var/run/screen/S-*/*)
    if (( ${#screens[@]} == 0 )); then
        echo "no screen session found in /var/run/screen"
    else
        echo "${screens[@]#*S-}"
    fi
fi

Он будет вести себя точно так же, как экран, за исключением отображения всех сеансов экрана, при предоставлении опции -ls-all в качестве первого параметра.

2

Несколько человек уже указали, что

$ screen -ls

отобразит сеансы экрана.

Вот еще один трюк, который может быть вам полезен.

Если вы добавите следующую команду в качестве последней строки в .bashrc файл на сервере xxx, то он автоматически подключится к вашему сеанс сеанса при входе в систему.

screen -d -r

Надеюсь, вы сочтете это полезным.

  • 1
    Хочу заметить, что вы должны войти в систему под тем же пользователем, который запустил экран, я волновался, что мой сеанс экрана пропал, но моя копия файла продолжалась под пользователем "media". Это может звучать логично, но это может спасти некоторую панику, если вы наблюдаете за этим.
0

Итак, вы используете экран, чтобы эксперименты работали в фоновом режиме, или что? Если да, почему бы не просто запустить его в фоновом режиме?

./experiment &

И если вы спрашиваете, как получить уведомление о выполненной задаче, как связать эксперимент вместе с почтовой командой?

./experiment && echo "the deed is done" | mail youruser@yourlocalworkstation -s "job on server $HOSTNAME is done"
  • 0
    Я использую экран, чтобы я мог отключиться от серверов, не прерывая свои эксперименты. Вопрос был не в том, как получать уведомления (хотя почта могла бы быть хорошим способом сделать это), а в том, как найти, было ли на данном компьютере сеанс открытого экрана. В любом случае, спасибо за ваш ответ!
  • 0
    Я не опытный системный администратор, но я считаю, что использование экрана для запуска серверных процессов работает хорошо: если что-то пойдет не так, вы можете просто щелкнуть по этому окну и увидеть все результаты, которые привели к проблеме - вам не нужно начать открывать файлы журнала. Это также означает, что вы можете легко убить процесс с помощью Ctrl + C. Это все удобно, если вы часто запускаете и закрываете один и тот же сервис.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню