Créer un écran et exécuter la commande sans attacher

29

Je travaille sur l'automatisation d'une routine de maintenance qui implique le démarrage et l'arrêt d'un script en cours d'exécution dans une session d'écran. Mon approche consiste à tuer la session d'écran, puis à la redémarrer et à exécuter la commande à partir d'un script en utilisant les capacités à la fois pour créer un écran et passer une commande sans avoir besoin de l'attacher à l'écran.

Cependant, j'ai des difficultés avec cela. Je peux créer l'écran correctement sans qu'il soit attaché à l'aide screen -d -m -S screen_name. Cependant, si j'exécute une commande basée sur:

screen -S screen_name-X stuff "command 1"'echo -ne '\015''"command 2"'echo -ne '\015''

avec l'écho -ne '\ 015' entouré de guillemets plutôt que de guillemets simples. Il s'agit de simuler l'utilisateur en appuyant sur la touche Entrée lorsque les commandes que j'utilise se déplacent vers un répertoire et exécutent un script qui s'y trouve. Cette commande fonctionne, mais uniquement si l'écran a été attaché à une fois qu'il a été créé. Comme j'essaie d'automatiser le processus de création de l'écran et d'exécution des commandes qu'il contient, je voudrais éviter d'avoir à attacher et à détacher dans un script. J'essaierai la suggestion de créer un script shell contenant les commandes dont j'ai besoin pour exécuter dans l'écran et éditer en fonction de mes résultats.

Existe-t-il un moyen de créer un écran et d'exécuter une commande à l'intérieur de l'écran, soit en une seule commande, soit sans avoir à l'attacher à l'écran après la création mais avant l'exécution de la commande?

Merci d'avance.

** Mise à jour - après avoir essayé la suggestion de placer les commandes dont j'ai besoin pour exécuter dans un script shell, j'ai réussi à créer un écran et à exécuter les commandes à partir de l'écran, mais je reçois le comportement que lorsque le script cesse de s'exécuter l'écran se ferme également. Cela ne devrait pas être un problème car le script est un script de journalisation qui ne doit s'arrêter qu'avec la connaissance de l'administrateur système ou via le script que j'essaie de développer, mais il serait préférable d'avoir la configuration de l'écran de telle sorte que l'écran ne disparaît pas si le script est arrêté. Est-il possible d'obtenir ce comportement? **

coffeecoder
la source
1
J'ai rencontré ce même problème et j'ai trouvé une solution sur superuser.com pour toute autre personne qui tombe sur ce problème superuser.com/questions/342463/…
Dan Herbert
Pour garder l'écran ouvert, vous pouvez utiliser quelque chose comme: screen bash -c 'echo "test"; / bin / bash '
gwyn
1
Pour votre problème de fermeture automatique, vous pouvez utiliser un spécial .screenrcqui contient la ligne zombie kr, qui gardera une fenêtre terminée ouverte, et vous pouvez appuyer sur kpour fermer le winodw, ou rpour exécuter à nouveau la commande dans la fenêtre. J'ai ceci pour mon .screenrc par défaut.
Martin C.

Réponses:

18

Je pense que vous rencontrez peut-être plusieurs problèmes.

Si la commande se termine avant de se reconnecter, l'écran disparaîtra. Vous pouvez faire une démonstration de ceci en utilisant:

screen -d -m ls -l

Il exécutera la ls -lcommande, mais screen -listne l'affichera pas à la fin du processus d'écran.

Je n'ai également aucune idée de ce que vous essayez de faire avec ce truc \ 015. La mise à jour de votre question serait peut-être utile, car je pense que vous essayez d'exécuter plusieurs commandes dans une session d'écran. Cela devrait être aussi simple que:

screen -d -m bash -c "command1 ; command2 ; command3"

Si ceux-ci sont beaucoup utilisés, vous devriez peut-être créer un script shell qui exécute uniquement ces commandes, puis utilisez une méthode plus simple:

screen -d -m /path/to/script.sh
Michael Graff
la source
existe-t-il un moyen d'obtenir un comportement similaire sans que l'écran ne se détache immédiatement? Disons que je veux démarrer une session ssh puis me détacher juste après; screen -d -m sshse détachera à l'invite du mot de passe avant la fin de la session.
étoile brillante
Ça ne marche pas pour moi. Remplacer hte "commandN" par plusieurs programmes de longue durée n'affiche rien screen -list. De plus, cela ne nomme pas l'écran comme l'OP essaie de le faire.
Cerin
Je cherchais à exécuter un programme python en utilisant cette méthode. J'ai essayé de créer un script sh pour l'exécuter, mais je n'ai pas vu l'écran dans la liste. Au lieu de cela, j'ai utilisé screen -d -m python EventGenerator.py, ce qui fonctionnait très bien
Dan Ciborowski - MSFT
1
Cela devrait probablement être bash -c "commands"au lieu debash "commands"
marcovtwout
Vous avez raison, il doit y avoir -c.
2016
9

Démarrer un écran détaché

screen -dmS <screen name>

Exécuter la commande dans l'écran détaché précédemment créé

screen -S <screen name> -X stuff '<CMD>\n'

Oui, vous devez taper le symbole Entrée pour soumettre la commande, sinon il ajoutera simplement la chaîne à l'écran.

http://osdir.com/ml/gnu.screen/2003-09/msg00029.html

Yogesh
la source
1
qu'est-ce que «truc»?
Nadav B
stuffest en fait une commande qui copie-colle une autre commande dans une session écran: stuff [string] Remplit la chaîne de chaîne dans le tampon d'entrée de la fenêtre en cours. C'est comme la commande "coller" mais avec beaucoup moins de frais généraux. Sans paramètre, l'écran vous invite à remplir une chaîne. Vous ne pouvez pas coller de gros tampons avec la commande "stuff". Il est très utile pour les raccourcis clavier. Voir aussi "bindkey". [cité sur theterminallife.com/sending-commands-into-a-screen-session/]
alisa
2

J'ai déjà rencontré ce problème auparavant, c'était un bug avec l'implémentation de cygwin.

J'ai créé un ".screenrc_detaching" avec seulement la commande suivante

#detach
detach 

puis démarrer l'écran avec

screen -c ~/loginScripts/tempScreenrc/.screenrc_detaching

Ensuite, vous avez votre session d'écran et elle est déjà attachée et détachée et vous êtes prêt à y pomper des commandes.

Facile ! : P

PiersyP
la source
2

Cela a fait le travail pour moi, sans -cne fonctionnait pas

screen -d -m bash -c "command1; command2; command3"

Mazilu88
la source
1

Un moyen de copier-coller pour tester les réponses précédentes est le suivant:

 # No sessions:
screen -ls

 # Returns immediately:
time screen -dmS screen_descritive_session_name  bash -c 'sleep 20; hostname >> /tmp/h'

 # New session present:
screen -ls

 # File with return of command was created :)
sleep 20; cat /tmp/h

Le résultat attendu devrait être similaire à:

No Sockets found in /var/run/screen/S-yourusernamehere.

(Cela signifie qu'aucune session d'écran n'a été créée précédemment)

real    0m0.002s
user    0m0.000s
sys     0m0.000s

(C'est le temps passé à créer un écran et à s'en détacher. Presque instantané.)

There is a screen on:
    20318.screen_descritive_session_name    (20/08/2018 16:29:35)   (Detached)
1 Socket in /var/run/screen/S-yourusernamehere.

(Cette sortie affiche les sessions d'écran disponibles. Créé lors de la dernière commande.)

sleep 20; cat /tmp/h

(Cela catmontre le nom d'hôte exécuté dans gnu-screen)

Enrique S. Filiage
la source
et quel est le résultat de ces tests?
Pierre.Vriens
Vous avez raison, il n'y avait pas d'exemple. Je vais ajouter.
Enrique S. Filiage
beaucoup mieux! merci! +1
Pierre.Vriens
0
screen -S test -d -m -- sh -c 'ls; exec $SHELL'
Nadav B
la source