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

10

Geralmente deixo as tarefas em execução na tela para poder verificá-las mais tarde, mas às vezes preciso verificar qual comando está sendo executado na tela. Geralmente é um tipo de script php, como

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

Não registro quais telas estão executando qual comando, mas eu gostaria de ter uma ideia do progresso feito, verificando qual comando foi executado nele, sem interromper o processo.

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

Austin Burk
fonte

Respostas:

18

Eu 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 pspara 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 da seguinte forma:

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

Suponhamos que você queira o PID do programa em execução no Bash na foo_Monitorsessão de tela. Use o PID da foo_Monitorsessão da tela para obter o PID da bashsessão em execução pesquisando PPIDs (PID pai) pelo 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 obtenha apenas o PID da bashsessão:

$ 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 -vsinalizador grep bashpara obter o processo que não é do 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}')
dotancohen
fonte
Oh, esperto! Eu gosto disso! Como isso responde diretamente à pergunta, vou aceitar essa resposta. Eu agradeço! @Ghanima (: '
Austin Burk
7

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

Edite para adicionar:

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

Ghanima
fonte