Pantalla Ejecutar (GNU) desde el script

11

Me gustaría iniciar alguna aplicación dentro de la sesión de pantalla pero desde un script.
Sin script, simplemente iniciaría la pantalla, luego abriría N windows con crtl-ac y ejecutaría programas en cada ventana.

Probé lo siguiente

screen -d -m -S test
screen -S test -X exec tail -f /var/log/messages
screen -S test -X screen
screen -S test -X exec tail -f /var/log/xinetd.log

Pero cuando adjunto la cola de la sesión no se está ejecutando. Si adjunto la sesión justo después screen -d -m -S startupy la ejecuto screen -S startup -X exec tail -f /var/log/messagesdesde otra terminal, funciona.

Me he perdido algo ?

Editar después de la respuesta de AlexD:

Una solución de medio trabajo es

screen -d -m -S test tail -f /var/log/messages
screen -S test -X screen tail -f /var/log/xinetd.log

El comando de encadenamiento de pantalla (el que está después de -X) con el comando funciona mientras que exec probablemente no sea porque el ejecutivo espera que se defina una ventana actual mientras que no hay una actual cuando la pantalla está separada. Gracias a AlexD por estos consejos.

Pero hay un efecto secundario extraño: cuando el programa se detiene (si adjunta la sesión de pantalla y crtl-c la cola, o cierra la cola), la ventana de la pantalla se cerrará.
Entonces, el comportamiento no es el mismo que Crtl-A c y ejecuta el comando
Otro efecto secundario es que no puede encadenar 2 comandos

radio
fuente
screen Siempre termina cuando el comando con el que se fue lanzada extremos - es una característica normal de la herramienta :) .so si se ejecuta screen top, al salir top, screense cerrará también
Warren
Sí, ahora eso, es por eso que intenté iniciar la pantalla como deamon y luego usar exec y luego usar el comando de pantalla para abrir una nueva ventana (iniciar un shell). También probé tu prepend bash entre exec y tail o entre pantalla y tell pero ninguno de los dos funciona
radio

Respuestas:

14

El screen -S test -X screen commandcomando es lo que necesita para agregar ventanas a su sesión de daemon, pero no por las razones que da. Funciona porque -X toma un comando de pantalla y no un comando de shell, y el comando de pantalla para crear una ventana se llama, confusamente, pantalla. No hay comando de pantalla exec. Tampoco hay encadenamiento, a menos que construya su comando utilizando scripts de shell (como este:) screen -S script -X screen sh -c 'command1; command2;'.

Llamar screen -S test -X screensin comando es inútil porque el comando predeterminado es un shell, y una vez que ha generado un shell, no tiene una forma no interactiva (y no desviada) de ejecutar comandos dentro de ese shell. Es mejor ejecutar el comando solo, sin un shell interactivo. Un efecto secundario es que cuando el comando sale, la ventana de la pantalla ya no tiene un hijo y se cerrará.

Ahora, puede pedirle a la pantalla que mantenga la ventana abierta de todos modos, después de que el comando se haya cerrado. Use el zombiecomando de pantalla para habilitar eso. Tu secuencia se ve así:

screen -d -m -S script
screen -S script -X zombie qr
screen -S script -X screen tail -f /var/log/messages
screen -S script -X screen tail -f /var/log/xinetd.log

Para volver a conectar de forma interactiva:

screen -S script -r

Y finalmente, puede reescribir estos comandos -X como un script screenrc en su lugar.

Screenrc:

zombie qr
screen tail -f /var/log/messages
screen tail -f /var/log/xinetd.log

Guión:

screen -d -m -S script -c screenrc
Tobu
fuente
Sí, sé que -X está tomando un comando de pantalla, eso es lo que quiero decir cuando dije "Encadenando el comando de pantalla (el que está después de -X)" (Ok, no está claro en absoluto) pero hay un comando de ejecución de pantalla, mira el hombre página, pero como dijiste, no hay forma de que funcione como se desea en modo no interactivo. De todos modos, con la solución AlexD y tu comando zombie, ¡agregué lo que quiero! Gracias
radio
@Tobu: +200 por mencionar zombies! ¡En última instancia, nunca lo habría notado en ese terrible manual!
vides
6

Si desea el mismo efecto Ctrl-A cque debe usar en screenlugar de exec:

pantalla -S prueba -X pantalla cola -f / var / log / messages
pantalla -S prueba -X pantalla
pantalla -S prueba -X pantalla cola -f /var/log/xinetd.log

Además, puede mover los comandos anteriores al $HOME/.screenrc-younameitarchivo (sin screen -S test -Xprefijo) y ejecutarlos screen -c $HOME/.screenrc-younameitcuando desee crear una sesión de pantalla específica.

AlexD
fuente
El Ctrl-A c está en mi tercera línea, supongo que exec no funciona porque exec ejecuta el comando en las ventanas actuales que podría no estar definido cuando la pantalla está separada. Su solución alternativa encadenando la pantalla y el comando es bueno, ¡debería haberlo intentado! Agregaré una respuesta para mí porque su respuesta carece de la creación de la sesión y tiene una línea inútil (segunda, saltando 1 ventana)
radio
De hecho, no funciona como se esperaba, las ventanas se cierran tan pronto como se detiene el programa. si haces pantalla -S prueba -X pantalla ls, la ventana se cerrará y nunca verás el resultado
radio
1

¿Está usando byobu una opción?

Sirex
fuente
Acabo de probarlo, no veo cómo podría ayudar, pero si tienes una solución que funcione con byobu, podría estar bien, prefiero una solución solo para pantalla, ¡pero usar un complemento es mejor que no tener solución!
radio
1

Estaba haciendo lo mismo esta noche, quería abrir la pantalla con varios archivos previamente abiertos. Me tomó un tiempo darme cuenta de todo esto, pero finalmente llegué a lo siguiente, que parece funcionar bastante bien:


#1/bin/sh 
screen -d -m -S CS140 
screen -S CS140 -X screen -t thread.c 
screen -p 1 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/thread.c\015"'
screen -S CS140 -X screen -t thread.h 
screen -p 2 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/thread.h\015"'
screen -S CS140 -X screen -t palloc.c 
screen -p 3 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/palloc.c\015"'
screen -S CS140 -X screen -t intr-stubs.h 
screen -p 4 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/intr-stubs.h\015"'
screen -S CS140 -X screen -t pagedir.c 
screen -p 5 -S CS140 -X eval 'stuff "vim cs140-ps2/src/userprog/pagedir.c\015"'
screen -r -d CS140 

Esto creará seis pantallas diferentes, con las pantallas 1-5 que han abierto varios archivos. No sé todos los detalles, pero 'cosas' esencialmente le dice a la pantalla que el siguiente texto citado no es un comando de pantalla. El 'eval' luego evalúa todo lo contenido en las comillas. Sin esto, screen -p 4 -S CS140 -X stuff "vim cs140-ps2/src/threads/intr-stubs.h\015" simplemente canaliza el texto citado sin ejecutarlo. Eval leerá '\ 015' como una nueva línea y, por lo tanto, ejecutará el texto anterior.

En términos de otros detalles, screen -p 1 -S CS140 -X CMD le dice al shell que envíe el 'CMD' a la primera ventana de la sesión de pantalla llamada 'CS140'.

¡Espero que ayude!

DevonH
fuente