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

35

J'essaie de forcer GNU screen à 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é plusieurs 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'ai une session sans script exécuté, le script s'exécute, mais la session est terminée une fois qu'il s'est terminé ou j'obtiens l'erreur "Aucune session d'écran trouvée".

Ce que je cherche à faire, c’est d’exécuter un programme d’écoute UDP, écrit en PHP, et de le faire fonctionner en boucle infinie (ne pas interrompre l’écoute). Oui, je pourrais exécuter un script PHP &à la fin, forçant PHP CLI à s'exécuter en tant que démon. Le problème, c'est que j'utilise un fichier indésirable appelé serveur (QNAP - ne l'achetez jamais, jamais!), Ce qui semble l'ignorer. Dès que je ferme la session SSH, les scripts s'arrêtent.

Donc, screensemble être la seule option. Mais je ne comprends pas pourquoi il termine la session une fois que la commande ou le script est exécuté.

EDIT : J'ai aussi essayé des exemples trouvés sur Internet:

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

Pas de manque! Après screen -R namem'y être attaché ( ), je vois que Midnight Commander N'A PAS été exécuté. Bien que l'exemple de l'auteur dise, ce sera le cas.

trejder
la source
De la manière dont vous appelez screen, vous ne créez qu'une fenêtre pour exécuter une seule commande. Lorsque la commande se ferme, la fenêtre se ferme et screenn'a plus rien à faire. Elle se ferme donc.
jw013
Alors ... y a-t-il un moyen d'ouvrir deux fenêtres (en ligne de commande uniquement, sans combinaisons de clavier), une pour exécuter un script et l'autre pour empêcher la screenfermeture? BTW: Je ne comprends toujours pas l'idée derrière! Si j'appelle screen -dmS name, je crée une fenêtre détachée, qui n'a également plus rien à faire. Mais ce n'est pas automatiquement fermé! Mais lorsque je veux exécuter quelque chose dans cet écran séparé, il se termine une fois que l'exécution est terminée. Pourquoi? Je ne vois pas la logique ici. Une fenêtre peut-elle ne rien faire, mais ne peut-elle pas faire quelque chose et ne rien faire?
trejder
2
Lorsque vous ouvrez une fenêtre sans spécifier de commande, il ne s'agit pas de "ne rien faire". Le "quelque chose" qu'il fait exécute un shell interactif, qui ne se ferme pas tant que vous ne le quittez pas manuellement.
jw013
Cool! Merci pour une explication! Alors ... revenons à la question ... est-il possible d'exécuter une commande à l'intérieur d'un écran / fenêtre détaché et PAS de terminer cette session, une fois l'exécution de la commande terminée? Aussi, s'il vous plaît jeter un oeil à la question mise à jour. Merci.
Trejder
Ce script exécute deux écouteurs UDP écrits en PHP. Bien que les deux soient exécutés en tant que démons (avec &à la fin), en raison d'un serveur buggy (QNAP), ils sont terminés à la fin de la session (on m'a dit, ils ne devraient pas sous Linux normal s'ils sont exécutés avec &). Donc, je ne cherche pas à faire quoi que ce soit après la start_udp_listeners.shfin, mais seulement à empêcher la fin de la session. Tant que ce n'est pas le cas, mes auditeurs PHP fonctionnent parfaitement.
Trejder

Réponses:

42

Pour que l'écran reste occupé une fois le script terminé, il suffit de garder quelque chose de persistant qui s'exécute 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 bashque le shell interactif soit le choix):

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 session pour l'écran pour une récupération plus facile ultérieurement
  • sh -c '...': au lieu de simplement exécuter votre script, qui se terminera, utilisez sh -cpour exécuter plusieurs commandes
  • exec bash: une fois le script terminé, l’en- shhaut bascule vers un shell interactif ( bash), qui ne doit jamais sortir tant que quelque chose d’extérieur ne l’a pas terminé. Cela restera screenouvert aussi longtemps que l' bashinstance sera en vie.
jw013
la source
1
Hm ... semble que tu es mon sauveur de vie! :] Prolonger votre solution avec export IGNOREEOF=1Ctrl + D pour éviter une résiliation accélérée devrait me donner la solution parfaite, j'ai cherché toute la soirée. MERCI! :]
trejder
Cela ne fonctionne pas sous Debian à ce jour, -c est un argument pour lire un fichier .screenrc alternatif ...
ToVine
@ToVine fonctionne parfaitement sur Debian Stable (Wheezy). J'ai utilisé bash -ccependant.
TranslucentCloud
@TranslucentCloud avez-vous entouré la citation de la commande "bash -c ..."? La dernière fois que j'ai essayé (juste avant d'écrire le commentaire) cela ne fonctionnait pas pour moi, je ne sais pas trop pourquoi ...
ToVine
@ToVine voici toute ma commande:screen -LS sauf bash -c "sudo aptitude update && sudo aptitude full-upgrade; exec bash"
TranslucentCloud
2

Je n'ai pas eu de chance avec sh -cma framboise pi 2 sous Debian 7.8. Mais bash -cle travail a-t-il:

Commander:

/usr/bin/screen -dmS test-screen bash -c "/usr/bin/top; exec bash"
Scotty86
la source
Est-ce possible, parce que vous utilisez (sur Raspberry Pi) une coque différente? Le bashet shsemble être deux coquilles différentes. C'est tout, je pense, mais je peux me tromper, étant donné que je suis novice sous Linux.
trejder
1
sh est le shell unix par défaut, il est inclus dans raspbian (debian). La commande sh fonctionne également, mais pas sh -c en combinaison avec screen.
scotty86
Merci @ scotty86, j’ai observé la même chose dans Linux Mint 19 (Ubuntu 18.04) et changer sh -cpour bash -cfaire le tour. Je ne comprends pas pourquoi, les deux shet bashsont installés, donc je perds encore le sommeil, mais au moins ça marche.
Redsandro
shpointe probablement vers /bin/dashau lieu de /bin/bash. Debian est passée du shell par défaut bashà il y dasha quelques années.
scai