Je voudrais lancer une application à l'intérieur d'une session écran mais à partir d'un script.
Sans script, je lancerais simplement l'écran, puis ouvrirais N fenêtres avec crtl-ac et exécuterais des programmes dans chaque fenêtre.
J'ai essayé ce qui suit
screen -d -m -S test
screen -S test -X exec tail -f /var/log/messages
screen -S test -X screen
screen -S test -X exec tail -f /var/log/xinetd.log
Mais quand j'attache la queue de session ne fonctionne pas. Si j'attache la session juste après screen -d -m -S startup
et que je l' exécute à screen -S startup -X exec tail -f /var/log/messages
partir d'un autre terminal, cela fonctionne.
Ai-je oublié quelque chose ?
Modifier après la réponse d'AlexD:
Une solution à moitié fonctionnelle est
screen -d -m -S test tail -f /var/log/messages
screen -S test -X screen tail -f /var/log/xinetd.log
Le chaînage de la commande d'écran (celle après -X) avec la commande fonctionne alors que exec n'est probablement pas parce que exec attend une fenêtre actuelle à définir alors qu'il n'y en a pas une lorsque l'écran est détaché. Merci à AlexD pour ces conseils.
Mais il y a un effet secondaire étrange: lorsque le programme s'arrête (si vous attachez la session d'écran et crtl-c la queue, ou tuez la queue), la fenêtre d'écran se fermera.
Donc, le comportement n'est pas le même que Crtl-A c et exécutez la commande
Un autre effet secondaire est que vous ne pouvez pas enchaîner 2 commandes
la source
screen
se termine toujours lorsque la commande qui a été lancée se termine - c'est une fonctionnalité normale de l'outil :) .. donc si vous exécutezscreen top
, lorsque vous quitteztop
, sescreen
fermera aussiRéponses:
La
screen -S test -X screen command
commande est ce dont vous avez besoin pour ajouter des fenêtres à votre session démon, mais pas pour les raisons que vous donnez. Cela fonctionne parce que -X prend une commande d'écran et non une commande shell, et la commande d'écran pour créer une fenêtre s'appelle, confusément, écran. Il n'y a pas de commande d'écran exec. Il n'y a pas de chaînage non plus, sauf si vous créez votre commande à l'aide de scripts shell (comme ceci:)screen -S script -X screen sh -c 'command1; command2;'
.Appeler
screen -S test -X screen
sans commande est inutile car la commande par défaut est un shell, et une fois que vous avez généré un shell, vous n'avez pas de moyen non interactif (et non sournois) d'exécuter des commandes à l'intérieur de ce shell. Il est préférable d'exécuter la commande seule, sans shell interactif. Un effet secondaire est que lorsque la commande se termine, la fenêtre d'écran n'a plus d'enfant et se ferme.Maintenant, vous pouvez demander à screen de maintenir la fenêtre ouverte de toute façon, une fois la commande terminée. Utilisez la
zombie
commande d'écran pour l'activer. Votre séquence ressemble à:Pour rattacher de manière interactive:
Et enfin, vous pouvez réécrire ces commandes -X en tant que script screenrc à la place.
Screenrc:
Scénario:
la source
Si vous voulez le même effet que
Ctrl-A c
vous devez utiliser à lascreen
place deexec
:En outre, vous pouvez déplacer vos commandes ci-dessus dans un
$HOME/.screenrc-younameit
fichier (sansscreen -S test -X
préfixe) et lancerscreen -c $HOME/.screenrc-younameit
lorsque vous souhaitez créer une session d'écran spécifique.la source
l'utilisation de byobu est- elle une option?
la source
Je faisais la même chose ce soir, je voulais ouvrir l'écran avec plusieurs fichiers pré-ouverts. Il m'a fallu un certain temps pour comprendre tout cela, mais j'ai finalement trouvé ce qui suit qui semble fonctionner assez bien:
Cela créera six écrans différents, les écrans 1 à 5 ayant ouvert divers fichiers. Je ne connais pas tous les détails, mais «stuff» dit essentiellement à l'écran que le texte cité ci-dessous n'est pas une commande d'écran. L'évalu évloute alors tout ce qui est contenu dans les devis. Sans cela,
screen -p 4 -S CS140 -X stuff "vim cs140-ps2/src/threads/intr-stubs.h\015"
il canalise simplement le texte cité sans l'exécuter. Eval lira '\ 015' comme une nouvelle ligne et exécutera ainsi le texte précédent.En termes d'autres détails,
screen -p 1 -S CS140 -X CMD
indique au shell d'envoyer le «CMD» à la première fenêtre de la session d'écran nommée «CS140».J'espère que cela pourra aider!
la source