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, screen
semble ê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 name
m'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.
la source
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 etscreen
n'a plus rien à faire. Elle se ferme donc.screen
fermeture? BTW: Je ne comprends toujours pas l'idée derrière! Si j'appellescreen -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?&
à 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 lastart_udp_listeners.sh
fin, mais seulement à empêcher la fin de la session. Tant que ce n'est pas le cas, mes auditeurs PHP fonctionnent parfaitement.Réponses:
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
bash
que le shell interactif soit le choix):-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érieurementsh -c '...'
: au lieu de simplement exécuter votre script, qui se terminera, utilisezsh -c
pour exécuter plusieurs commandesexec bash
: une fois le script terminé, l’en-sh
haut bascule vers un shell interactif (bash
), qui ne doit jamais sortir tant que quelque chose d’extérieur ne l’a pas terminé. Cela resterascreen
ouvert aussi longtemps que l'bash
instance sera en vie.la source
export IGNOREEOF=1
Ctrl + D pour éviter une résiliation accélérée devrait me donner la solution parfaite, j'ai cherché toute la soirée. MERCI! :]bash -c
cependant.screen -LS sauf bash -c "sudo aptitude update && sudo aptitude full-upgrade; exec bash"
Je n'ai pas eu de chance avec
sh -c
ma framboise pi 2 sous Debian 7.8. Maisbash -c
le travail a-t-il:Commander:
la source
bash
etsh
semble être deux coquilles différentes. C'est tout, je pense, mais je peux me tromper, étant donné que je suis novice sous Linux.sh -c
pourbash -c
faire le tour. Je ne comprends pas pourquoi, les deuxsh
etbash
sont installés, donc je perds encore le sommeil, mais au moins ça marche.sh
pointe probablement vers/bin/dash
au lieu de/bin/bash
. Debian est passée du shell par défautbash
à il ydash
a quelques années.