web-dev-qa-db-fra.com

Comment créer un écran exécutant une commande donnée?

je suis assez nouveau dans * nix. Existe-t-il un moyen de créer un écran, qui exécutera immédiatement une séquence de commandes donnée (avec leurs propres arguments)? Deux heures de recherche sur Google ne donnent rien - peut-être parce que je ne peux pas énoncer clairement la question.

J'espère quelque chose comme

screen -dmS new_screen exec "cd /dir && Java -version"

J'utilise l'écran v4.00.03 et CentOS 5.5 (noyau ver. 2.6.18-194.26.1.el5.028stab079.2)

31
Alex Abdugafarov

Le problème est que l'utilisation de la commande d'écran "exec" ne démarre pas un shell. 'cd' est un shell intégré, vous avez donc besoin d'un shell pour cela. En outre, vous avez besoin d'un shell qui continue de fonctionner pour que l'écran ne se termine pas.

Vous pouvez utiliser l'option -X pour filtrer pour envoyer des commandes à une session d'écran en cours et la commande "stuff" pour envoyer des frappes à la fenêtre actuelle. Essaye ça:

screen -dmS new_screen sh
screen -S new_screen -X stuff "cd /dir
"
screen -S new_screen -X stuff "Java -version
"

Oui, vous devez mettre les guillemets sur la ligne suivante pour que les commandes soient exécutées.

32
mloar

Vous créez un écran avec un nom et en mode détaché:

screen -S "mylittlescreen" -d -m

Ensuite, vous envoyez la commande à exécuter sur votre écran:

screen -r "mylittlescreen" -X stuff $'ls\n'

Le $ avant que la commande ne fasse que le Shell analyse le\n à l'intérieur des guillemets, et la nouvelle ligne est requise pour exécuter la commande (comme lorsque vous appuyez sur Entrée).

Cela fonctionne pour moi sur cette version d'écran:

$ screen -v

Version d'écran 4.00.03jw4 (FAU) 2-mai-06

S'il te plait regarde man screen pour plus de détails sur les commandes.

36
kR105

screen -dmS screen_name bash -c 'sleep 100'

Cela créera un nouvel écran nommé screen_name. Et à l'intérieur de l'écran, il dormira pendant 100 secondes.

Notez que si vous tapez une commande à la place de sleep 100 qui se termine immédiatement lors de l'exécution, l'écran se terminera également. Vous ne pourrez donc pas voir l'écran que vous venez de créer

5
Tushar Goswami

Je voulais lancer des écrans distants à partir d'un script bash avec certaines variables définies à l'intérieur du script bash et disponibles à l'intérieur de l'écran. Donc ce qui a fonctionné pour moi

#!/bin/bash
SOMEVAR1="test2"
# quit existing if there is one running already, be careful
screen -D -RR test1 -X quit || true
screen -dmS test1
screen -r test1 -p 0 -X stuff $"echo ${SOMEVAR1} ^M"

Où le caractère de retour, ^ M, vous devez entrer en utilisant vim comme

i CTRL-V ENTER ESCAPE
2
jsh

Je pense que vous pouvez l'utiliser

function exec_in_screen() {
  name=$1
  command=$2
  screen -dmS $name sh; screen -S $name -X stuff "$command\n";
} 

Alors...

exec_in_screen "test" "ls"

1
Pedro Rodrigues

Une autre approche

CD de première ligne dans votre répertoire. La deuxième ligne démarre une nouvelle session d'écran nommée new_screen avec bash. Troisième ligne exécutant Java -version

cd /dir
screen -dmS new_screen bash
screen -S new_screen -p 0 -X exec Java -version
0
Dilushan