web-dev-qa-db-fra.com

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

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 est de tuer la session d'écran, puis de la redémarrer et d'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 de 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 que je dois 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? **

29
coffeecoder

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 le ls -l commande, mais screen -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. Peut-être que la mise à jour de votre question serait utile, car ce que je pense que vous essayez de faire, c'est 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
18
Michael Graff

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 suffit d'ajouter la chaîne à l'écran.

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

11
Yogesh

J'ai 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

2
PiersyP

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

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

2
Mazilu88

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

(Ce cat montre le nom d'hôte exécuté dans gnu-screen)

1
Enrique S. Filiage
screen -S test -d -m -- sh -c 'ls; exec $Shell'
0
Nadav B