Empêcher l'écran GNU de terminer la session une fois le script exécuté

J'essaye de forcer l'écran GNU à créer un terminal "virtuel", sans y attacher, exécuter le script à l'intérieur et NON terminer la session une fois que le script se termine.

J'ai essayé plusieurs combinaisons, y compris:

screen -dmS udplistner /share/Sys/autorun/start_udp_listners.sh 

ou

 screen -S udplistner -X /share/Sys/autorun/start_udp_listners.sh 

et aucun d'eux n'a travaillé. J'obtiens la session sans le script exécuté, le script s'exécute, mais la session est terminée une fois qu'il est terminé ou que j'obtiens l'erreur "Aucune session d'écran trouvée".

Ce que j'essaie essentiellement de faire est d'exécuter UDP listner, écrit en PHP et le faire fonctionner en boucle infinie (ne pas rompre l'écoute). Oui – Je pourrais exécuter un script PHP avec & à la fin, obligeant PHP CLI à s'exécuter en tant que démon. Le problème est que j'utilise un morceau d'ordure appelé server (QNAP – jamais, jamais acheter cette ordure!) Qui semble ignorer cela. Dès que je ferme la session SSH, les scripts s'arrêtent.

Donc, l' screen semble être la seule option. Mais je ne peux pas comprendre, pourquoi il termine la session une fois que la command exécutée ou le script se termine?

EDIT : J'ai aussi essayé exemple trouvé sur Internet:

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

Pas de manque! Après l'avoir attaché ( screen -R name ), je vois que Midnight Commander n'a pas été exécuté. Bien que l'auteur exemple a dit, ce sera.

Pour garder l'écran occupé après la fin du script, il suffit de garder quelque chose de persistant en cours d'exécution dans une window. Le choix le plus simple pour ce "quelque chose" est probablement une coquille interactive. Voici une façon de le faire (en supposant que bash soit le choix de la coquille interactive):

 screen -dmS session_name sh -c '/share/Sys/autorun/start_udp_listners.sh; exec bash' 
  • -dm : lance l'écran en mode détaché
  • -S : définit le nom de la session à l'écran pour faciliter la récupération plus tard
  • sh -c '...' : au lieu de simplement exécuter votre script, qui se terminera, utilisez sh -c pour exécuter plusieurs commands
  • exec bash : après la fin du script, le sh d'en haut passera à un shell interactif ( bash ), qui ne devrait jamais sortir tant que quelque chose d'externe ne le terminera pas. Cela gardera l' screen ouvert tant que l'instance bash est en vie.

Je n'ai pas eu de chance avec sh -c sur mon Raspberry Pi 2 exécutant Debian 7.8. Mais bash -c fait le boulot:

Commander:

 /usr/bin/screen -dmS test-screen bash -c "/usr/bin/top; exec bash"