Découvrez quelle commande s'exécute dans une session d'écran

10

Je laisse souvent des tâches s'exécuter dans l'écran afin de pouvoir les vérifier plus tard, mais j'ai parfois besoin de vérifier quelle commande s'exécute sur l'écran. C'est généralement un script php, comme

screen -d -m nice -n -10 php -f convertThread.php start=10000

Je n'enregistre pas quels écrans exécutent quelle commande, mais j'aimerais pouvoir avoir une idée des progrès réalisés en vérifiant quelle commande a été exécutée à l'intérieur, sans tuer le processus.

Je ne vois aucune option pour cela dans les pages d'aide de l'écran.

Austin Burk
la source

Réponses:

18

J'ai récemment dû le faire. Sur Stack Overflow, j'ai répondu comment trouver le PID du processus en cours d'exécution à l'écran . Une fois que vous avez le PID, vous pouvez utiliser pspour obtenir la commande. Voici le contenu de cette réponse avec un contenu supplémentaire pour répondre à votre situation:

Vous pouvez obtenir le PID des sessions d'écran ici comme ceci:

$ screen -ls
There are screens on:
        1934.foo_Server         (01/25/15 15:26:01)     (Detached)
        1876.foo_Webserver      (01/25/15 15:25:37)     (Detached)
        1814.foo_Monitor        (01/25/15 15:25:13)     (Detached)
3 Sockets in /var/run/screen/S-ubuntu.

Supposons que vous souhaitiez que le PID du programme s'exécute dans Bash dans la foo_Monitorsession écran. Utilisez le PID de la foo_Monitorsession écran pour obtenir le PID de la bashsession en cours d'exécution en recherchant les PID (PID parent) pour le PID connu:

$ ps -el | grep 1814 | grep bash
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  1815  1814  0  80   0 -  5520 wait   pts/1    00:00:00 bash

Maintenant, obtenez juste le PID de la bashsession:

$ ps -el | grep 1814 | grep bash | awk '{print $4}'
1815

Maintenant, nous voulons le processus avec ce PID. Il suffit d'imbriquer les commandes, et cette fois, utilisez l' -vindicateur grep bashpour obtenir le processus qui n'est pas bash:

$ echo $(ps -el | grep $(ps -el | grep 1814 | grep bash | awk '{print $4}') | grep -v bash | awk '{print $4}')
23869

Nous pouvons utiliser ce PID pour trouver la commande (Regardez à la fin de la deuxième ligne):

$ ps u -p 23869
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
dotanco+ 18345 12.1 20.1 5258484 3307860 ?     Sl   Feb02 1147:09 /usr/lib/foo

Mets le tout ensemble:

$ ps u -p $(ps -el | grep $(ps -el | grep SCREEN_SESSION_PID | grep bash | awk '{print $4}') | grep -v bash | awk '{print $4}')
dotancohen
la source
Oh, intelligent! Je l'aime! Comme cela répond directement à la question, je vais accepter cette réponse. Je vous en suis reconnaissant! Désolé @Ghanima (: '
Austin Burk
7

Que diriez-vous d'utiliser screen -S <your-fancy-name>pour donner aux sessions d'écran des noms significatifs en fonction des commandes qu'elles exécutent? Les noms seront répertoriés avec screen -lset seront utilisés pour reprendre une session par screen -r <your-fancy-name>.

Modifier pour ajouter:

Puisqu'il a été porté à mon attention l'autre jour. tmuxoffre à peu screenprès le même ensemble de fonctionnalités (sinon plus) et est livré avec une fonctionnalité adaptée à vos besoins. De la FAQ: "tmux prend en charge le renommage automatique des fenêtres en application en cours sans hacks grossiers en utilisant des séquences d'échappement. C'est même activé par défaut."

Ghanima
la source