Comment lister les sessions écran en cours?


233

J'ai un tas de serveurs, sur lesquels j'exécute des expériences en utilisant screen. La procédure est la suivante:

  1. ssh au serveur XXX
  2. lancement screen
  3. démarrer des expériences dans quelques onglets
  4. détacher screen
  5. se déconnecter du serveur

Pendant que les expériences sont en cours d'exécution, je peux facilement trouver sur quels serveurs ils se trouvent en sshing sur tous les serveurs et en listant mes processus en cours (en utilisant topou ps).

Cependant, une fois les expériences terminées, comment puis-je trouver sur quels serveurs une session d'écran est ouverte (pour que je puisse regarder la sortie, les relancer, etc.)?

PS: mes expériences impriment également leur sortie dans des fichiers ... mais ce n'est pas le point de ma question.

Réponses:


420

Pour répertorier toutes les sessions d'écran pour un utilisateur, exécutez la commande suivante en tant que cet utilisateur:

screen -ls

Pour voir toutes les sessions d'écran sur une machine spécifique, vous pouvez faire:

ls -laR /var/run/screen/

Je reçois ceci sur ma machine:

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

Il s'agit d'une utilisation assez brillante pour Unixy des sockets Unix enveloppés dans des autorisations de système de fichiers pour gérer la sécurité, l'état et les flux.


1
Je me demande pourquoi cette réponse, qui a parfaitement répondu à la question, a obtenu un
vote négatif

Alternativement, si vous souhaitez obtenir un écran spécifique basé sur une convention de dénomination, vous pouvez récupérer le résultat. ls -R /var/run/screen/S-root/ | grep "NamingConvention". Les écrans sont enregistrés au <pid>.<screen_name>format. Ceci est utile pour les scripts bash. Donc, si vous avez un écran avec un nom, 0000.NamingConventionil retournera littéralement le nom des écrans que vous recherchez dans un format facile à analyser.
Elias Ranz


13

Bien que la réponse de joshperry soit correcte, je trouve très ennuyeux qu'il ne vous indique pas le nom d'écran (celui que vous définissez avec l'option -t), c'est en fait ce que vous utilisez pour identifier une session. (pas sa faute, bien sûr, c'est un défaut d'écran)

C'est pourquoi j'utilise plutôt un script comme celui-ci: ps auxw|grep -i screen|grep -v grep


2
Jetez un œil à l'option -S. La valeur fournie est stockée dans le nom de fichier du socket Unix et est visible dans la lssortie. Si vous en avez besoin, vous pouvez également conserver l'option -t.
joshperry

L'option -S est excellente, car elle vous permet également de reprendre par le nom de cette session:screen -rd <sessionname>
jorisw

7

Je ne suis pas vraiment sûr de votre question, mais si tout ce que vous voulez vraiment c'est lister la session écran actuellement ouverte, essayez:

screen -ls

6
 For windows system

 Open putty 
 then login in server

Si vous voulez voir l'écran dans la console, vous devez écrire une commande

 Screen -ls

si vous devez accéder à l'écran, vous devez utiliser la commande ci-dessous

 screen -x screen id

Écrivez PWDen ligne de commande pour vérifier dans quel dossier vous vous trouvez actuellement


3

Dans la plupart des cas, un screen -RRx $username/testament suffira :)

Si vous souhaitez toujours répertorier tous les écrans, placez le script suivant dans votre chemin et appelez-le écran ou ce que vous voulez:

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

Il se comportera exactement comme screen sauf pour afficher toutes les sessions screen, en donnant l'option -ls-all comme premier paramètre.


3

Plusieurs personnes ont déjà souligné que

$ screen -ls

énumérerait les sessions d'écran.

Voici une autre astuce qui peut vous être utile.

Si vous ajoutez la commande suivante comme dernière ligne dans votre fichier .bashrc sur le serveur xxx, elle se reconnectera automatiquement à votre session d'écran lors de la connexion.

screen -d -r

J'espère que vous le trouverez utile.


1
Je veux noter que vous devrez être connecté en tant que même utilisateur qui a démarré l'écran, je craignais que ma session d'écran ait disparu, mais ma copie de fichier se poursuivait sous l'utilisateur "media". Cela peut sembler logique, mais cela pourrait vous éviter de paniquer si vous le supervisez.
Paul

0

ps x | ÉCRAN GREP

pour voir quel écran fonctionne au cas où vous auriez utilisé la commande

écran -A -m -d php make_something.php


-4

Vous utilisez donc l'écran pour maintenir les expériences en arrière-plan, ou quoi? Si oui, pourquoi ne pas simplement le démarrer en arrière-plan?

./experiment &

Et si vous demandez comment obtenir une notification pour le travail que j'ai fait, pourquoi ne pas enchaîner l'expérience avec une commande de messagerie?

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

J'utilise l'écran pour pouvoir me déconnecter des serveurs sans terminer mes expériences. La question n'était pas de savoir comment obtenir des notifications (bien que le courrier puisse être un bon moyen de le faire), mais comment savoir si une machine donnée avait une session d'écran ouverte. Merci quand même pour votre réponse!
Wookai

Je ne suis pas un administrateur système expérimenté, mais je trouve que l'utilisation de l'écran pour exécuter les processus du serveur fonctionne bien: si quelque chose ne va pas, vous pouvez simplement parcourir cette fenêtre et voir toutes les sorties qui ont conduit au problème - vous n'avez pas besoin de commencer à ouvrir les fichiers journaux. Cela signifie également que vous pouvez facilement tuer un processus avec ctrl + c. Tout cela est pratique si vous démarrez et arrêtez fréquemment le même service.
Steve Bennett
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.