Как составить список запущенных сеансов экрана?

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

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

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

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

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


person Wookai    schedule 11.02.2009    source источник


Ответы (9)


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

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, завернутых в разрешения файловой системы для управления безопасностью, состоянием и потоками.

person joshperry    schedule 11.02.2009
comment
Интересно, почему этот ответ, который идеально ответил на вопрос, получил отрицательный голос... - person Blaszard; 22.10.2016
comment
В качестве альтернативы, если вы хотите получить определенный экран на основе соглашения об именах, вы можете получить результат. ls -R /var/run/screen/S-root/ | grep "NamingConvention". Скрины сохраняются в формате <pid>.<screen_name>. Это полезно для bash-скриптов. Поэтому, если у вас есть экран с именем 0000.NamingConvention, он буквально просто вернет имя экрана, который вы ищете, в удобном для анализа формате. - person Elias Ranz; 16.08.2018

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

См. man

person Zoredache    schedule 11.02.2009

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

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

person o0'.    schedule 25.08.2010
comment
Взгляните на опцию -S. Предоставленное значение сохраняется в имени файла сокета unix и отображается в выводе ls. Если вам нужно, вы также можете оставить опцию -t. - person joshperry; 23.04.2017
comment
Параметр -S великолепен, так как он также позволяет возобновить работу с этим именем сеанса: screen -rd <sessionname> - person jorisw; 16.05.2020

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

screen -ls
person skinp    schedule 11.02.2009

 For windows system

 Open putty 
 then login in server

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

 Screen -ls

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

 screen -x screen id

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

person Ankit jain    schedule 22.11.2013

В большинстве случаев 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 в качестве первого параметра.

person ObiWahn    schedule 02.03.2012

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

$ screen -ls

будет перечислять сеансы экрана.

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

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

screen -d -r

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

person samurai    schedule 11.02.2009
comment
Я хочу отметить, что вам нужно будет войти в систему как тот же пользователь, который запустил экран, я волновался, что мой сеанс экрана пропал, но моя копия файла продолжалась под пользовательским медиа. Это может звучать логично, но это может избавить вас от паники, если вы проследите за этим. - person Paul; 09.03.2018

пс х | grep ЭКРАН

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

экран -A -m -d php make_something.php

person Community    schedule 22.04.2018

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

./experiment &

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

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