Come elencare le sessioni dello schermo in esecuzione?


233

Ho un sacco di server, su cui eseguo esperimenti utilizzando screen. La procedura è la seguente:

  1. ssh al server XXX
  2. lanciare screen
  3. inizia gli esperimenti in alcune schede
  4. Staccare screen
  5. disconnettersi dal server

Mentre gli esperimenti sono in corso, posso facilmente trovare su quali server si trovano sshin tutti i server ed elencare i miei processi in esecuzione (usando topo ps).

Tuttavia, una volta terminati gli esperimenti, come posso trovare su quali server ho aperto una sessione schermo (in modo da poter vedere l'output, riavviarli, ecc.)?

PS: anche i miei esperimenti stampano il loro output su file ... ma questo non è il punto della mia domanda.

Risposte:


420

Per elencare tutte le sessioni dello schermo per un utente, eseguire il comando seguente come tale utente:

screen -ls

Per vedere tutte le sessioni dello schermo su una macchina specifica puoi fare:

ls -laR /var/run/screen/

Lo ottengo sul mio computer:

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

Questo è un uso piuttosto brillante di Unixy dei socket Unix racchiusi nelle autorizzazioni del filesystem per gestire sicurezza, stato e flussi.


1
Mi chiedo perché questa risposta, che ha risposto perfettamente alla domanda, abbia ottenuto un
voto negativo

In alternativa, se si desidera ottenere una schermata specifica basata su una convenzione di denominazione, è possibile visualizzare il risultato. ls -R /var/run/screen/S-root/ | grep "NamingConvention". Le schermate vengono salvate nel <pid>.<screen_name>formato. Questo è utile per gli script bash. Quindi, se hai una schermata con nome 0000.NamingConvention, restituirà letteralmente il nome delle schermate che stai cercando in un formato facile da analizzare.
Elias Ranz,

19

La schermata dei comandi -list potrebbe essere quella che desideri.

Vedi l' uomo


13

Mentre la risposta di joshperry è corretta, trovo molto fastidioso che non ti dica il nome dello schermo (quello che hai impostato con l'opzione -t), che è effettivamente quello che usi per identificare una sessione. (non per colpa sua, ovviamente, è un difetto dello schermo)

Ecco perché utilizzo invece uno script come questo: ps auxw|grep -i screen|grep -v grep


2
Dai un'occhiata all'opzione -S. Il valore fornito è memorizzato nel nome file del socket unix ed è visibile lsnell'output. Se necessario, è possibile mantenere anche l'opzione -t.
joshperry,

L'opzione -S è fantastica, poiché ti consente anche di riprendere con quel nome di sessione:screen -rd <sessionname>
jorisw,

7

Non sono davvero sicuro della tua domanda, ma se tutto ciò che vuoi davvero è elencare la sessione dello schermo attualmente aperta, prova:

screen -ls

6
 For windows system

 Open putty 
 then login in server

Se vuoi vedere lo schermo nella Console, devi scrivere il comando

 Screen -ls

se devi accedere allo schermo devi usare il comando seguente

 screen -x screen id

Scrivi PWDnella riga di comando per verificare in quale cartella sei attualmente


3

Nella maggior parte dei casi screen -RRx $username/basta un testamento :)

Se vuoi ancora elencare tutte le schermate, inserisci il seguente script nel tuo percorso e chiamalo schermata o come preferisci:

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

Si comporterà esattamente come lo schermo tranne che per mostrare tutte le sessioni dello schermo, quando si dà l'opzione -ls-all come primo parametro.


3

Molte persone lo hanno già indicato

$ screen -ls

elencherebbe le sessioni dello schermo.

Ecco un altro trucco che potrebbe esserti utile.

Se aggiungi il seguente comando come ultima riga nel tuo file .bashrc sul server xxx, si riconnetterà automaticamente alla sessione dello schermo all'accesso.

screen -d -r

Spero lo trovi utile.


1
Voglio notare che dovrai accedere come lo stesso utente che ha avviato lo schermo, ero preoccupato che la mia sessione dello schermo fosse sparita, ma la mia copia del file continuava sotto "media" dell'utente. Può sembrare logico, ma potrebbe risparmiare un po 'di panico se lo controlli.
Paul

0

ps x | grep SCREEN

per vedere qual è quella schermata in esecuzione nel caso in cui tu abbia usato il comando

schermo -A -m -d php make_something.php


-4

Quindi stai usando lo schermo per mantenere gli esperimenti in esecuzione in background, o cosa? In tal caso, perché non avviarlo in background?

./experiment &

E se stai chiedendo come ricevere una notifica del lavoro svolto, che ne dici di mettere insieme l'esperimento insieme a un comando di posta?

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

Sto usando lo schermo in modo da poter disconnettermi dai server senza terminare i miei esperimenti. La domanda non era come ottenere le notifiche (sebbene la posta potesse essere un buon modo per farlo), ma come scoprire se una determinata macchina aveva una sessione schermo aperta. Grazie comunque per la tua risposta!
Wookai,

Non sono un amministratore di sistema esperto, ma trovo che l'uso dello schermo per eseguire i processi del server funzioni bene: se qualcosa va storto, puoi semplicemente passare a quella finestra e vedere tutto l'output che ha portato al problema - non è necessario inizia ad aprire i file di registro. Significa anche che puoi facilmente uccidere un processo con ctrl + c. Tutto ciò è utile se si avvia e si arresta frequentemente lo stesso servizio.
Steve Bennett,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.