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 screen
parece 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á.
fuente
screen
, solo crea una ventana para ejecutar un solo comando. Cuando el comando sale, la ventana se cierra yscreen
no queda nada que hacer, por lo que sale.screen
cierre? Por cierto: ¡todavía no entiendo la idea! Si llamoscreen -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?&
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 destart_udp_listeners.sh
finalizar, solo cómo evitar que se termine la sesión. Mientras no sea así, mis oyentes PHP funcionan bien.Respuestas:
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
bash
que sea la opción del shell interactivo):-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 adelantesh -c '...'
: en lugar de simplemente ejecutar su script, que terminará, usesh -c
para ejecutar múltiples comandosexec bash
: después de que finalice el script, losh
de arriba cambiará a un shell interactivo (bash
), que nunca debería salir hasta que algo externo lo finalice. Esto se mantendráscreen
abierto mientras labash
instancia esté viva.fuente
export IGNOREEOF=1
para evitar la terminación accidental con Ctrl + D debería darme la solución perfecta, he estado buscando toda la noche. ¡GRACIAS! :]bash -c
sin embargo.screen -LS sauf bash -c "sudo aptitude update && sudo aptitude full-upgrade; exec bash"
No tuve suerte con
sh -c
mi raspberry pi 2 con Debian 7.8. Perobash -c
hizo el trabajo:Mando:
fuente
bash
ysh
parece ser dos conchas diferentes. Eso es todo, creo, pero puedo estar equivocado, ya que soy un novato en Linux.sh -c
abash -c
hacer el truco. No entiendo por qué, tantosh
ybash
están instalados, así que todavía estoy perdiendo el sueño por eso, pero al menos funciona.sh
probablemente apunta a en/bin/dash
lugar de/bin/bash
. Debian cambió el shell por defecto a partirbash
dedash
hace unos años.