2009-02-12 9 views
23

Selon le docs for the Unix "screen" command, vous pouvez le configurer dans .screenrc pour commencer avec un tas d'écrans par défaut, chacun exécutant une commande que vous spécifiez.Comment lancer une commande d'écran Unix avec une commande?

Voici mon cofig:

# Default screens 
screen -t "shell_0" 1 
screen -t "autotest" 2 cd ~/project/contactdb ; autotest 

Il ne sera pas exécuter la commande auto-test. Cette fenêtre où j'essaye de courir autotest se ferme juste immédiatement quand je commence screen.

J'ai essayé aussi avec juste ...

screen -t "autotest" 2 cd ~/project/contactdb 

Même résultat.

J'ai aussi essayé ...

screen -t "autotest" 2 ls 

Même résultat là aussi.

Quel est le secret pour l'obtenir pour exécuter une commande dans un écran donné au démarrage?

Répondre

21

Votre programme est en cours d'exécution (enfin, sauf le cd), c'est juste qu'il est exécuté sans shell parent, donc dès qu'il se termine, il se termine et vous avez terminé.

Vous pouvez faire:

screen -t "autotest" 2 bash -c 'cd ~/project/contactdb ; autotest' 

engende deux obus, mais la vie va probablement continuer.

6

Cela peut aider mais peut ne pas être entièrement ce que vous voulez. Mettez "zombie az" ou "defzombie az" comme première ligne de votre fichier .screenrc "az" peut être n'importe quel 2 clés que vous aimeriez. Maintenant, quand un écran doit se fermer (commande terminée, par exemple), il ne fermera pas; frapper 'a' le fermera, frapper 'z' ré-exécutera la commande attachée à cet écran.

J'ai trouvé cela à the screen user's manual.

4

Voici à quoi ressemble le mien. Cela semble marcher correctement. Je pense que la parenthèse peut être à l'origine du problème ou l'écran n'ouvre pas une fenêtre si la commande "autotest" n'existe pas.

screen -t zsh 1 
screen -t emacs 2 emacs -nw 
screen -t mutt 3 mutt 
monitor on 
screen -t mc 4 mc -s 
screen -t elinks 4 elinks 
5

Vous pouvez aussi les caractères « stuff » dans l'écran comme si vous les aviez tapé.

Voilà comment vous pouvez le faire avec votre exemple:


screen -t "shell_0" 1 

# create the following screen in the desired dir, instead of cd-ing afterwards :) 
chdir ~/project/contactdb 
screen -t "autotest" 2 

# (without this sometimes screens fail to start correctly for me) 
sleep 5 

# paste some text into screen number 2: 
select 2 
stuff "autotest\012" 
15

Essayez ceci:

$ screen -S 'tailf messages' -d -m tailf /var/log/messages 

Ensuite, vous pouvez faire plus tard:

$ screen -ls 
1234.tailf messages 

Suivi par:

$screen -r 1234 
0

Voici comment je le ferais.

screen -t shell_0 
chdir ~/project/contactdb 
screen -t autotest autotest 

Ce qui précède semble être évalué de manière procédurale par écran. Nous établissons d'abord un nouvel écran avec le titre shell_0. Comme nous n'avons pas donné d'autres options, le répertoire de travail actuel sera celui du shell parent ou du répertoire personnel de l'utilisateur. Nous définissons ensuite le répertoire par défaut pour les nouveaux écrans à ~/project/contactdb. Ensuite, nous établissons un nouvel écran exécutant la commande autotest.

Le numéro de fenêtre (n) est facultatif, je l'omets généralement.

Questions connexes