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? **
la source
.screenrc
qui contient la lignezombie kr
, qui gardera une fenêtre terminée ouverte, et vous pouvez appuyer surk
pour fermer le winodw, our
pour exécuter à nouveau la commande dans la fenêtre. J'ai ceci pour mon .screenrc par défaut.Réponses:
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:
Il exécutera la
ls -l
commande, maisscreen -list
ne 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:
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:
la source
screen -d -m ssh
se détachera à l'invite du mot de passe avant la fin de la session.screen -list
. De plus, cela ne nomme pas l'écran comme l'OP essaie de le faire.screen -d -m python EventGenerator.py
, ce qui fonctionnait très bienbash -c "commands"
au lieu debash "commands"
Démarrer un écran détaché
Exécuter la commande dans l'écran détaché précédemment créé
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
la source
stuff
est 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/]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
puis démarrer l'écran avec
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
la source
Cela a fait le travail pour moi, sans
-c
ne fonctionnait passcreen -d -m bash -c "command1; command2; command3"
la source
Un moyen de copier-coller pour tester les réponses précédentes est le suivant:
Le résultat attendu devrait être similaire à:
(Cela signifie qu'aucune session d'écran n'a été créée précédemment)
(C'est le temps passé à créer un écran et à s'en détacher. Presque instantané.)
(Cette sortie affiche les sessions d'écran disponibles. Créé lors de la dernière commande.)
(Cela
cat
montre le nom d'hôte exécuté dans gnu-screen)la source
la source