envoyer une commande à une session écran déjà en cours d'exécution

11

J'ai essayé d'envoyer des commandes à une session d'écran gnu en cours (4.00.03) dans opensolaris, mais je ne parviens pas à exécuter des commandes via une combinaison de screen -X

Ok, je démarre une session d'écran avec screen -S test, puis j'essaye de avec screen -r -X "date"pour me montrer la date à laquelle je me reconnecterais. Mais ni un message d'erreur ni une sortie à l'écran ne se sont produits. J'ai essayé avec tellement de combinaisons que je ne me souviens même pas.

Des conseils sur la façon de l'accomplir?

La raison pour laquelle je fais cela, c'est parce que j'ai un programme, qui ne vient pas en tant que démon, et je souhaite le démarrer dans une session d'écran, afin que je puisse plus tard voir ce qui se passe.

Der Hochstapler
la source
1
il semble que cette "commande" dont ils parlent dans les pages de manuel soit destinée à une commande d'écran, comme les paramètres de la session d'écran elle-même. Plutôt que d'envoyer des commandes pour le shell, qui est ouvert dans la session écran. Donc, quelqu'un a une idée de comment y arriver avec un script bash ??
@Axon: Oui, -X envoie des commandes d'écran, pas des commandes shell, mais l'écran a une commande 'écran' qui peut ouvrir de nouvelles fenêtres d'écran.

Réponses:

18

En fait, c'est assez simple. Vous pouvez utiliser les éléments suivants:

screen -S sessionname -X stuff 'command'`echo -ne '\015'`

echo -ne '\015'émule en appuyant sur la Entertouche.

REMARQUE: ce «truc» est une commande d'écran. http://www.gnu.org/software/screen/manual/screen.html#Stuff

le portier
la source
Pourriez-vous, s'il vous plaît, préciser ce que "substance" représente? Est-ce un nom ... ou une commande ... ou d'autres paramètres?
Cerin
Cela fonctionne en fait, mais je ne dirais pas que c'est simplement de toute façon;) C'est quelque chose comme passer des événements tapés et passer un retour à l'écran. N'y a-t-il pas simplement une commande d'exécution d'écran normale ...?
ducin
@Cecin: stuffest une commande d'écran pour 'bourrer' une chaîne dans stdin
konrad
C'est très bien, mais pour une raison quelconque, cela ne fonctionne pas avec "screen -RdS sessionname -X stuff 'ls -l' echo -ne '\015'", pourquoi?
e271p314
cela ne fonctionne que si j'exécute la commande deux fois ... et sur des lignes de commande distinctes ... si je ne fais screen -d -m -S sessionname; screen -S sessionname -X [...]rien, cela ne fonctionnera jamais même (screen -d -m -S sessionname&)&sleep 10;screen -S sessionname -X [...]si ce n'est créer une nouvelle session d'écran qui ne fait rien. vote
négatif
5

Sonne comme vous le souhaitez:

$ screen -S test -d -m -c / dev / null - sh -c 'date; exec $ SHELL '

-S test: nommez cette session
-d -m: écran de démarrage détaché
-c / dev / null: ignorer ~ / .screenrc (fournir un fichier différent ou supprimer cette option,
  comme requis)
-: options de fin d'écran
sh -c 'date; exec $ SHELL ': commande pour l'exécution de l'écran, notez que si cette commande
  était juste «date», puis l'écran se fermerait immédiatement. si vous ne voulez pas sortir
  après la sortie de votre commande, vous pouvez utiliser:
    $ screen -S test -d -m -c / dev / null - votre commande ici

Ou peut-être que vous voulez juste détacher .


la source
L'exécution de cela ne donne rien. Aucun message de réussite ou d'erreur, mais screen -listindique qu'aucune session n'est ouverte.
Cerin
Cette réponse a fonctionné pour moi. La clé était le - pour mettre fin aux options d'écran.
Plazgoth
1
screen -S <session_name> -X screen [-t <title>] <shell_command> [<args>]

Ouvrez une nouvelle fenêtre (avec le titre du titre ) dans une session existante nommée session_name , et exécutez shell_command (avec des arguments optionnels args )

Jeremy Kao
la source