Evitar que la pantalla de GNU termine la sesión una vez que finaliza el script ejecutado

35

Estoy tratando de forzar a la pantalla GNU a crear un terminal "virtual", sin conectarlo, ejecutar el script dentro y NO terminar la sesión una vez que el script termina.

Intenté muchas combinaciones, incluyendo:

screen -dmS udplistener /share/Sys/autorun/start_udp_listeners.sh

o

screen -S udplistener -X /share/Sys/autorun/start_udp_listeners.sh

y ninguno de ellos funcionó. O recibo sesión sin script ejecutado, el script se ejecuta, pero la sesión finaliza una vez que finaliza o aparece el error "No se encontró sesión de pantalla".

Lo que básicamente estoy tratando de hacer es ejecutar el escucha UDP, escrito en PHP y hacerlo funcionar en bucle infinito (no interrumpa la escucha). Sí, podría ejecutar el script PHP &al final, obligando a PHP CLI a ejecutarse como daemon. El problema es que estoy usando un pedazo de basura llamado servidor (QNAP: ¡nunca, nunca compre esta basura!) Que parece estar ignorando esto. Tan pronto como cierre la sesión de SSH, los scripts se detienen.

Entonces screenparece ser la única opción. Pero no puedo entender, ¿por qué termina la sesión una vez que finaliza el comando ejecutado o finaliza el script?

EDITAR : También he probado el ejemplo que se encuentra en Internet:

screen -dmS name
screen -S name -p windowname -X stuff 'mc
'

No falta! Después de adjuntarlo ( screen -R name) veo que Midnight Commander NO HA sido ejecutado. Aunque el autor de ejemplo dijo, lo será.

trejder
fuente
La forma en que está invocando screen, solo crea una ventana para ejecutar un solo comando. Cuando el comando sale, la ventana se cierra y screenno queda nada que hacer, por lo que sale.
jw013
Entonces ... ¿hay alguna manera de abrir dos ventanas (usando solo la línea de comando, sin combinaciones de teclado), una para ejecutar un script y la segunda para evitar que se screencierre? Por cierto: ¡todavía no entiendo la idea! Si llamo screen -dmS name, creo una ventana separada, que tampoco tiene nada que hacer. ¡Pero no se cierra automáticamente! Pero cuando quiero ejecutar algo en esa pantalla separada, termina una vez que se realiza la ejecución. ¿Por qué? No veo lógica aquí. ¿Puede tener ventana sin hacer nada, pero no puede tener ventana haciendo algo y luego sin hacer nada?
trejder
2
Cuando inicia una ventana sin especificar un comando, no se trata de " no hacer nada". El "algo" que está haciendo es ejecutar un shell interactivo, que no sale hasta que salga manualmente.
jw013
¡Guay! Gracias por una explicación! Entonces ... volviendo a la pregunta ... ¿hay alguna manera de ejecutar un comando dentro de una pantalla / ventana separada y NO para finalizar esa sesión, una vez que finaliza la ejecución del comando? Además, eche un vistazo a la pregunta actualizada. Gracias.
trejder
Este script está ejecutando dos oyentes UDP escritos en PHP. Aunque ambos se ejecutan como demonios (con &al final), debido al servidor con errores (QNAP), se terminan cuando finaliza la sesión (me dijeron, no deberían en Linux normal, si se ejecutan con &). Por lo tanto, no estoy buscando hacer nada después de start_udp_listeners.shfinalizar, solo cómo evitar que se termine la sesión. Mientras no sea así, mis oyentes PHP funcionan bien.
trejder

Respuestas:

42

Para mantener la pantalla ocupada después de que se complete el script, simplemente mantenga algo persistente ejecutándose en una ventana. La opción más simple para ese "algo" es probablemente un shell interactivo. Aquí hay una forma de hacerlo (suponiendo bashque sea la opción del shell interactivo):

screen -dmS session_name sh -c '/share/Sys/autorun/start_udp_listeners.sh; exec bash'
  • -dm: inicia la pantalla en modo separado
  • -S: establece el nombre de la sesión para la pantalla para una recuperación más fácil más adelante
  • sh -c '...': en lugar de simplemente ejecutar su script, que terminará, use sh -cpara ejecutar múltiples comandos
  • exec bash: después de que finalice el script, lo shde arriba cambiará a un shell interactivo (bash ), que nunca debería salir hasta que algo externo lo finalice. Esto se mantendrá screenabierto mientras la bashinstancia esté viva.
jw013
fuente
1
Hm ... parece que eres mi salvador de vida! :] Ampliar su solución export IGNOREEOF=1para evitar la terminación accidental con Ctrl + D debería darme la solución perfecta, he estado buscando toda la noche. ¡GRACIAS! :]
trejder
Esto no funciona en Debian a partir de hoy, -c es un argumento para leer un archivo .screenrc alternativo ...
ToVine
@ToVine funciona perfectamente en Debian Stable (Wheezy). Yo solía bash -csin embargo.
TranslucentCloud
@TranslucentCloud ¿incluiste todo el comando "bash -c ..." entre comillas? La última vez que lo intenté (justo antes de escribir el comentario) no funcionó para mí, no estoy seguro de por qué ...
ToVine
@ToVine aquí está todo mi comando:screen -LS sauf bash -c "sudo aptitude update && sudo aptitude full-upgrade; exec bash"
TranslucentCloud
2

No tuve suerte con sh -cmi raspberry pi 2 con Debian 7.8. Pero bash -chizo el trabajo:

Mando:

/usr/bin/screen -dmS test-screen bash -c "/usr/bin/top; exec bash"
scotty86
fuente
¿Podría ser esto porque estás usando (en Raspberry Pi) un shell diferente? El bashy shparece ser dos conchas diferentes. Eso es todo, creo, pero puedo estar equivocado, ya que soy un novato en Linux.
trejder
1
sh es el shell de Unix predeterminado, está incluido en raspbian (debian). El comando sh también funciona, pero no sh -c en combinación con la pantalla.
scotty86
Gracias @ scotty86, observé lo mismo en Linux Mint 19 (Ubuntu 18.04) y cambié sh -ca bash -chacer el truco. No entiendo por qué, tanto shy bashestán instalados, así que todavía estoy perdiendo el sueño por eso, pero al menos funciona.
Redsandro
shprobablemente apunta a en /bin/dashlugar de /bin/bash. Debian cambió el shell por defecto a partir bashde dashhace unos años.
Scai