J'essaie de forcer l'écran GNU à créer un terminal "virtuel", sans s'y attacher, à exécuter le script à l'intérieur et à NE PAS terminer la session une fois le script terminé.
J'ai essayé de nombreuses combinaisons, notamment :
screen -dmS udplistener /share/Sys/autorun/start_udp_listeners.sh
ou
screen -S udplistener -X /share/Sys/autorun/start_udp_listeners.sh
et aucun d'eux n'a fonctionné. Soit j'obtiens une session sans script exécuté, soit le script s'exécute, mais la session se termine une fois qu'elle est terminée, soit j'obtiens l'erreur "Aucune session d'écran trouvée".
Ce que j'essaie essentiellement de faire, c'est d'exécuter un écouteur UDP, écrit en PHP et de le faire fonctionner en boucle infinie (ne pas casser l'écoute). Oui - je pourrais exécuter un script PHP avec &
à la fin, forçant PHP CLI à s'exécuter en tant que démon. Le problème est que j'utilise un morceau de bric-à-brac appelé serveur (QNAP - n'achetez jamais, jamais ce bric-à-brac !) qui semble ignorer cela. Dès que je me déconnecte de la session SSH, les scripts s'arrêtent.
Alors screen
semble être la seule option. Mais je ne comprends pas pourquoi il met fin à la session une fois la commande exécutée ou le script terminé ?
MODIFIER :J'ai aussi essayé exemple trouvé sur Internet :
screen -dmS name
screen -S name -p windowname -X stuff 'mc
'
Pas de manque ! Après y avoir attaché (screen -R name
) Je vois que Midnight Commander N'A PAS été exécuté. Bien que l'auteur de l'exemple l'ait dit, ce sera le cas.
Réponse acceptée :
Pour garder l'écran occupé après la fin du script, gardez simplement quelque chose de persistant en cours d'exécution dans une fenêtre. Le choix le plus simple pour ce "quelque chose" est probablement un shell interactif. Voici une façon de le faire (en supposant que bash
comme choix de shell interactif) :
screen -dmS session_name sh -c '/share/Sys/autorun/start_udp_listeners.sh; exec bash'
-dm
:démarre l'écran en mode détaché-S
:définit le nom de la session pour l'écran afin de faciliter sa récupération ultérieuresh -c '...'
:au lieu de simplement exécuter votre script, qui se terminera, utilisezsh -c
pour exécuter plusieurs commandesexec bash
:après la fin du script, lesh
d'en haut basculera vers un shell interactif (bash
), qui ne devrait jamais se fermer tant que quelque chose d'extérieur ne l'a pas terminé. Cela gardera l'screen
ouvert tant que lebash
l'instance est active.