Як перерахувати запущені екранні сесії?


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 Sockets, загорнутого у дозволи файлової системи, для обробки безпеки, стану та потоків.


1
Цікаво, чому ця відповідь, яка чудово відповіла на запитання, отримала відгук ...
Blaszard

Крім того, якщо ви хочете отримати конкретний екран на основі конвенції про іменування, ви можете отримати результат. 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 socket і відображається у lsвисновку. Якщо вам потрібно, ви також можете зберегти варіант -t.
joshperry

Варіант -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/буде достатньо :)

Якщо ви все ще хочете перерахувати всі екрани, тоді поставте на свій шлях наступний скрипт і назвіть його на екрані або будь-якому іншому:

#!/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
Хочу зазначити, що вам доведеться ввійти в систему як той самий користувач, який запустив екран, я переживав, що сеанс на екрані зник, але копія файлу тривала під користувачем "медіа". Це може здатися логічним, але це може врятувати певну паніку, якщо ви його наглядаєте.
Поль


-4

Отже, ви використовуєте екран, щоб тримати експерименти у фоновому режимі, чи що? Якщо так, то чому б просто не почати його на задньому плані?

./experiment &

І якщо ви запитуєте, як отримати сповіщення про виконану роботу, як щодо стрункового експерименту разом з поштовою командою?

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

Я використовую екран, щоб я міг відключитися від серверів, не припиняючи експериментів. Питання полягало не в тому, як отримувати сповіщення (хоча пошта може бути приємним способом зробити це), а в тому, як дізнатися, чи був у певної машини відкритий сеанс екрану. Все одно дякую за вашу відповідь!
Wookai

Я не досвідчений sysadmin, але я вважаю, що використання екрана для запуску серверних процесів працює добре: якщо щось піде не так, ви можете просто перейти до цього вікна і побачити всі результати, що призвели до проблеми - вам не потрібно почати відкривати файли журналів. Це також означає, що ви можете легко вбити процес за допомогою ctrl + c. Це все зручно, якщо ви часто запускаєте та вимикаєте ту саму послугу.
Стів Беннетт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.