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 startup
y la ejecuto screen -S startup -X exec tail -f /var/log/messages
desde 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
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 ejecutascreen top
, al salirtop
,screen
se cerrará tambiénRespuestas:
El
screen -S test -X screen command
comando 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 screen
sin 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
zombie
comando de pantalla para habilitar eso. Tu secuencia se ve así:Para volver a conectar de forma interactiva:
Y finalmente, puede reescribir estos comandos -X como un script screenrc en su lugar.
Screenrc:
Guión:
fuente
Si desea el mismo efecto
Ctrl-A c
que debe usar enscreen
lugar deexec
:Además, puede mover los comandos anteriores al
$HOME/.screenrc-younameit
archivo (sinscreen -S test -X
prefijo) y ejecutarlosscreen -c $HOME/.screenrc-younameit
cuando desee crear una sesión de pantalla específica.fuente
¿Está usando byobu una opción?
fuente
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:
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!
fuente