Jak wyświetlić listę sesji ekranowych?

233

Mam kilka serwerów, na których uruchamiam eksperymenty screen. Procedura jest następująca:

  1. ssh do serwera XXX
  2. uruchomić screen
  3. rozpocznij eksperymenty na kilku kartach
  4. odłączyć screen
  5. odłączyć od serwera

Podczas eksperymentów mogę łatwo znaleźć, na których serwerach są, wchodząc sshna wszystkie serwery i wymieniając moje uruchomione procesy (używając toplub ps).

Jednak po zakończeniu eksperymentów, jak mogę znaleźć, na których serwerach mam otwartą sesję ekranową (aby móc zobaczyć dane wyjściowe, ponownie je uruchomić itp.)?

PS: moje eksperymenty również drukują swoje dane wyjściowe do plików ... ale nie o to chodzi w moim pytaniu.

Wookai
źródło

Odpowiedzi:

420

Aby wyświetlić listę wszystkich sesji ekranu dla użytkownika, uruchom następujące polecenie jako ten użytkownik:

screen -ls

Aby zobaczyć wszystkie sesje ekranu na określonym komputerze, możesz:

ls -laR /var/run/screen/

Dostaję to na moim komputerze:

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

Jest to dość genialnie uniksowe użycie gniazd uniksowych opakowanych w uprawnienia systemu plików do obsługi bezpieczeństwa, stanu i strumieni.

joshperry
źródło
1
Zastanawiam się, dlaczego ta odpowiedź, która doskonale odpowiedziała na pytanie, otrzymała głos negatywny ...
Blaszard,
Alternatywnie, jeśli chcesz uzyskać określony ekran oparty na konwencji nazewnictwa, możesz grep wynik. ls -R /var/run/screen/S-root/ | grep "NamingConvention". Ekrany zapisują w <pid>.<screen_name>formacie. Jest to przydatne w skryptach bash. Więc jeśli masz ekran z nazwą 0000.NamingConvention, dosłownie zwróci nazwę ekranu, którego szukasz, w łatwym do przeanalizowania formacie.
Elias Ranz
19

Komenda screen -list może być to, co chcesz.

Zobacz człowieka

Zoredache
źródło
13

Chociaż odpowiedź Joshperry'ego jest prawidłowa, bardzo denerwuje mnie to, że nie podaje ona nazwy ekranowej (tej, którą ustawiłeś za pomocą opcji -t), to w rzeczywistości to, czego używasz do identyfikowania sesji. (oczywiście nie jego wina, to wada ekranu)

Dlatego zamiast tego używam takiego skryptu: ps auxw|grep -i screen|grep -v grep

o0 ”.
źródło
2
Spójrz na opcję -S. Podana wartość jest przechowywana w nazwie pliku gniazda UNIX i jest widoczna na lswyjściu. Jeśli potrzebujesz, możesz także zachować opcję -t.
joshperry 23.04.17
Opcja -S jest świetna, ponieważ umożliwia także wznowienie według nazwy sesji:screen -rd <sessionname>
jorisw
7

Nie jestem do końca pewien twojego pytania, ale jeśli wszystko, czego naprawdę chcesz, to lista aktualnie otwartych sesji ekranowych, spróbuj:

screen -ls
skinp
źródło
6
 For windows system

 Open putty 
 then login in server

Jeśli chcesz zobaczyć ekran w konsoli, musisz napisać polecenie

 Screen -ls

jeśli musisz uzyskać dostęp do ekranu, musisz użyć poniższego polecenia

 screen -x screen id

Wpisz PWDw wierszu polecenia, aby sprawdzić, w którym folderze aktualnie się znajdujesz

Ankit jain
źródło
3

W większości przypadków screen -RRx $username/wystarczy :)

Jeśli nadal chcesz wyświetlić listę wszystkich ekranów, umieść następujący skrypt na swojej ścieżce i nazwij go screen lub cokolwiek chcesz:

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

Będzie zachowywał się dokładnie tak samo jak screen, z wyjątkiem pokazywania wszystkich sesji screen, podając opcję -ls-all jako pierwszy parametr.

ObiWahn
źródło
3

Wiele osób już to wskazało

$ screen -ls

wyświetli listę sesji ekranowych.

Oto kolejna sztuczka, która może ci się przydać.

Jeśli dodasz następujące polecenie jako ostatnią linię w pliku .bashrc na serwerze xxx, to automatycznie połączy się ponownie z twoją sesją screen po zalogowaniu.

screen -d -r

Mam nadzieję, że uznasz to za przydatne.

samuraj
źródło
1
Chcę zauważyć, że będziesz musiał być zalogowany jako ten sam użytkownik, który uruchomił ekran, martwiłem się, że moja sesja ekranowa zniknęła, ale moja kopia pliku była kontynuowana pod użytkownikiem „media”. Może to zabrzmieć logicznie, ale może zaoszczędzić paniki, jeśli będziesz go nadzorować.
Paul
0

ps x | grep SCREEN

aby zobaczyć, co to ekran działa w przypadku użycia polecenia

screen -A -m -d php make_something.php

theworlddecoded
źródło
-4

Więc używasz ekranu, aby utrzymać eksperymenty w tle, czy co? Jeśli tak, dlaczego nie uruchomić go w tle?

./experiment &

A jeśli pytasz, jak uzyskać powiadomienie o pracy, którą wykonałem, co powiesz na powiązanie eksperymentu z poleceniem mail?

./experiment && echo "the deed is done" | mail youruser@yourlocalworkstation -s "job on server $HOSTNAME is done"
JosefAssad
źródło
Używam ekranu, aby móc rozłączyć się z serwerami bez przerywania eksperymentów. Pytanie nie polegało na tym, jak uzyskać powiadomienia (chociaż poczta może być dobrym sposobem na zrobienie tego), ale jak sprawdzić, czy dana maszyna miała otwartą sesję ekranową. W każdym razie dziękuję za odpowiedź!
Wookai
Nie jestem doświadczonym sysadminem, ale uważam, że używanie ekranu do uruchamiania procesów serwera działa dobrze: jeśli coś pójdzie nie tak, możesz po prostu przejść do tego okna i zobaczyć wszystkie dane wyjściowe, które doprowadziły do ​​problemu - nie musisz zacznij otwierać pliki dziennika. Oznacza to również, że możesz łatwo zabić proces za pomocą Ctrl + C. Jest to przydatne, jeśli często uruchamiasz i zamykasz tę samą usługę.
Steve Bennett,