it-swarm.com.de

Wie erstelle ich einen Bildschirm, auf dem ein bestimmter Befehl ausgeführt wird?

ich bin ziemlich neu in * nix. Gibt es eine Möglichkeit, einen Bildschirm zu erstellen, der eine bestimmte Befehlssequenz (mit eigenen Argumenten) sofort ausführt? Zwei Stunden googeln bringen nichts - vielleicht, weil ich die Frage nicht klar formulieren kann.

Ich hoffe auf sowas

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

Ich verwende screen v4.00.03 und CentOS 5.5 (Kernel Version 2.6.18-194.26.1.el5.028stab079.2)

31

Das Problem ist, dass mit dem Befehl 'exec' screen keine Shell gestartet wird. 'cd' ist eine eingebaute Shell, daher benötigen Sie eine Shell dafür. Außerdem benötigen Sie eine Shell, die weiterhin ausgeführt wird, damit der Bildschirm nicht beendet wird.

Sie können die Option -X für den Bildschirm verwenden, um Befehle an eine laufende Bildschirmsitzung zu senden, und den Befehl 'stuff', um Tastatureingaben an das aktuelle Fenster zu senden. Versuche dies:

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

Ja, Sie müssen die Anführungszeichen in die nächste Zeile setzen, damit die Befehle ausgeführt werden.

32
mloar

Sie erstellen einen Bildschirm mit einem Namen und im getrennten Modus:

screen -S "mylittlescreen" -d -m

Dann senden Sie den Befehl, der auf Ihrem Bildschirm ausgeführt werden soll:

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

Das $ Bevor der Befehl ausgeführt wird, muss die Shell das\n in den Anführungszeichen analysieren, und der Zeilenvorschub muss den Befehl ausführen (wie wenn Sie die Eingabetaste drücken).

Dies funktioniert für mich auf dieser Bildschirmversion:

$ screen -v

Bildschirmversion 4.00.03jw4 (FAU) 2-May-06

Bitte siehe man screen für Details zu den Befehlen.

36
kR105

screen -dmS screen_name bash -c 'sleep 100'

Dadurch wird ein neuer Bildschirm mit dem Namen screen_name Erstellt. Und auf dem Bildschirm wird 100 Sekunden lang geschlafen.

Beachten Sie, dass der Bildschirm auch beendet wird, wenn Sie einen Befehl anstelle von sleep 100 Eingeben, der sofort nach der Ausführung beendet wird. Damit Sie den soeben erstellten Bildschirm nicht sehen können

5
Tushar Goswami

Ich wollte entfernte Bildschirme aus einem Bash-Skript heraus starten, wobei einige Variablen innerhalb des Bash-Skripts definiert und innerhalb des Bildschirms verfügbar waren. Also, was für mich funktioniert hat, war

#!/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"

Wo das Rückgabezeichen ^ M ist, müssen Sie mit vim as eingeben

i CTRL-V ENTER ESCAPE
2
jsh

Ich denke, dass Sie das nutzen können

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

Dann...

exec_in_screen "test" "ls"

1
Pedro Rodrigues

Ein anderer Ansatz

Erste Zeile CD in das Verzeichnis. In der zweiten Zeile wird eine neue Bildschirmsitzung mit dem Namen new_screen mit bash gestartet. Dritte Zeile beim Ausführen von Java -version

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