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


233

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

  1. ssh на сервер XXX
  2. запуск screen
  3. начать эксперименты в нескольких вкладках
  4. открепление screen
  5. отключиться от сервера

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

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

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

Ответы:


420

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

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 ..

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


1
Интересно, почему этот ответ, тот, который отлично ответил на вопрос, получил отрицательное голосование ...
Блазард

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


13

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

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


2
Посмотрите на опцию -S. Предоставленное значение сохраняется в имени файла сокета unix и отображается в lsвыводе. Если вам нужно, вы также можете сохранить опцию -t.
Джошперри

Опция -S отличная, так как она также позволяет вам продолжить с этого имени сеанса:screen -rd <sessionname>
jorisw

7

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

screen -ls

6
 For windows system

 Open putty 
 then login in server

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

 Screen -ls

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

 screen -x screen id

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


3

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

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

#!/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.


3

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

$ screen -ls

будет список сеансов экрана.

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

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

screen -d -r

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


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

0

пс х | grep ЭКРАН

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

screen -A -m -d php make_something.php


-4

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

./experiment &

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

./experiment && echo "the deed is done" | mail youruser@yourlocalworkstation -s "job on server $HOSTNAME is done"

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

Я не опытный системный администратор, но я считаю, что использование экрана для запуска серверных процессов работает хорошо: если что-то пойдет не так, вы можете просто щелкнуть в этом окне и увидеть все результаты, которые привели к проблеме - вам не нужно начать открывать файлы журнала. Это также означает, что вы можете легко убить процесс с помощью Ctrl + C. Это все удобно, если вы часто запускаете и закрываете один и тот же сервис.
Стив Беннетт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.