Averigüe qué comando se ejecuta dentro de una sesión de pantalla

10

A menudo dejo las tareas ejecutándose dentro de la pantalla para poder verificarlas más tarde, pero a veces necesito verificar qué comando se está ejecutando dentro de la pantalla. Por lo general, es una especie de script php, como

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

No registro qué pantallas están ejecutando qué comando, pero me gustaría poder tener una idea del progreso realizado al verificar qué comando se ejecutó dentro de él, sin matar el proceso.

No veo ninguna opción para esto en las páginas de ayuda de la pantalla.

Austin Burk
fuente

Respuestas:

18

Recientemente tuve que hacer esto. En Stack Overflow, respondí cómo encontrar el PID del proceso que se ejecuta en la pantalla . Una vez que tenga el PID, puede usarlo pspara obtener el comando. Aquí está el contenido de esa respuesta con algún contenido adicional para abordar su situación:

Puede obtener el PID de las sesiones de pantalla aquí, así:

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

Supongamos que desea el PID del programa que se ejecuta en Bash en la foo_Monitorsesión de pantalla. Use el PID de la foo_Monitorsesión de pantalla para obtener el PID de la bashsesión ejecutándose en él buscando en los PPID (PID principal) el PID conocido:

$ 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

Ahora obtenga solo el PID de la bashsesión:

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

Ahora queremos el proceso con ese PID. Simplemente anide los comandos, y esta vez use la -vbandera grep bashpara obtener el proceso que no es bash:

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

Podemos usar ese PID para encontrar el comando (Mire al final de la segunda línea):

$ 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

Ponlo todo 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
fuente
¡Oh, listo! ¡Me gusta! Como esto responde la pregunta directamente, voy a aceptar esta respuesta. ¡Lo aprecio! Lo siento @Ghanima (: '
Austin Burk
7

¿Qué pasa con el uso screen -S <your-fancy-name>para dar a las sesiones de pantalla nombres significativos de acuerdo con los comandos que ejecutan? Los nombres se enumerarán screen -lsy se utilizarán para reanudar una sesión screen -r <your-fancy-name>.

Editar para agregar:

Desde que me ha llamado la atención el otro día. tmuxofrece el mismo conjunto de funcionalidades que screen(si no más) y viene con una función que se adapta a sus necesidades. De las preguntas frecuentes: "tmux admite cambiar automáticamente el nombre de Windows a la aplicación en ejecución sin hacks gruesos utilizando secuencias de escape. Incluso está activado de forma predeterminada".

Ghanima
fuente