Descobrir qual comando está sendo executado em uma sessão de tela

9

Costumo deixar tarefas em execução na tela para que eu possa verificá-las mais tarde, mas às vezes preciso verificar qual comando está sendo executado na tela. Geralmente é um script php, como

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

Eu não gravo quais telas estão executando o comando, mas gostaria de ter uma ideia do progresso feito, verificando qual comando foi executado dentro dele, sem matar o processo.

Não vejo nenhuma opção para isso nas páginas de ajuda da tela.

    
por Austin Burk 04.09.2014 / 21:40

2 respostas

14

Recentemente tive que fazer isso. No Stack Overflow, eu respondi como encontrar o PID do processo em execução na tela . Depois de ter o PID, você pode usar ps para obter o comando. Aqui está o conteúdo dessa resposta com algum conteúdo adicional para resolver sua situação:

Você pode obter o PID das sessões de tela aqui assim:

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

Vamos supor que você queira que o PID do programa seja executado no Bash na sessão de tela foo_Monitor . Use o PID da sessão de tela foo_Monitor para obter o PID da sessão bash em execução, pesquisando os PPIDs (Parent PID) para o PID conhecido:

$ 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

Agora, pegue apenas o PID da sessão bash :

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

Agora queremos o processo com esse PID. Apenas aninhe os comandos e, desta vez, use o -v flag em grep bash para obter o processo que é not bash:

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

Podemos usar esse PID para encontrar o comando (veja o final da segunda linha):

$ 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

Coloque tudo junto:

$ ps u -p $(ps -el | grep $(ps -el | grep SCREEN_SESSION_PID | grep bash | awk '{print $4}') | grep -v bash | awk '{print $4}')
    
por 09.02.2015 / 09:15
7

Que tal usar screen -S <your-fancy-name> para dar às sessões de tela nomes significativos de acordo com os comandos que eles executam? Os nomes serão listados com screen -ls e serão usados para retomar uma sessão por screen -r <your-fancy-name> .

Editar para adicionar:

Desde que foi trazido à minha atenção no outro dia. O tmux oferece o mesmo conjunto de funcionalidades que o screen (se não mais) e vem com um recurso adequado às suas necessidades. Do FAQ: "O tmux suporta renomear automaticamente as janelas para o aplicativo em execução sem hacks grosseiros usando seqüências de escape. É até ativado por padrão."

    
por 04.09.2014 / 22:22

Tags