Bildschirm erstellen und Befehl ausführen, ohne anzuhängen


28

Ich arbeite an der Automatisierung einer Wartungsroutine, bei der ein Skript gestartet und gestoppt wird, das in einer Bildschirmsitzung ausgeführt wird. Mein Ansatz ist es, die Bildschirmsitzung abzubrechen und anschließend neu zu starten und den Befehl in einem Skript auszuführen. Dabei können Sie sowohl einen Bildschirm erstellen als auch einen Befehl übergeben, ohne eine Verbindung zum Bildschirm herstellen zu müssen.

Ich habe jedoch Schwierigkeiten damit. Ich kann den Bildschirm korrekt erstellen, ohne ihn anhängen zu müssen screen -d -m -S screen_name. Wenn ich jedoch einen Befehl ausführe, der auf Folgendem basiert:

screen -S screen_name-X stuff "command 1"'echo -ne '\015''"command 2"'echo -ne '\015''

Das Echo -ne '\ 015' wird mit Backticks und nicht mit einfachen Anführungszeichen umschlossen. Es soll simulieren, dass der Benutzer die Eingabetaste drückt, während die von mir verwendeten Befehle in ein Verzeichnis verschoben und ein dort befindliches Skript ausgeführt werden. Dieser Befehl funktioniert, aber nur, wenn der Bildschirm nach seiner Erstellung angehängt wurde. Da ich versuche, den Prozess der Erstellung des Bildschirms und der Ausführung der darin enthaltenen Befehle zu automatisieren, möchte ich vermeiden, dass ich ein Skript anhängen und trennen muss. Ich werde versuchen, ein Shell-Skript zu erstellen, das die Befehle enthält, die ich auf dem Bildschirm ausführen und gemäß meinen Ergebnissen bearbeiten muss.

Gibt es eine Möglichkeit, einen Bildschirm zu erstellen und einen Befehl innerhalb des Bildschirms entweder in einem Befehl auszuführen oder ohne nach dem Erstellen, aber vor der Ausführung des Befehls, eine Verbindung zum Bildschirm herstellen zu müssen?

Danke im Voraus.

** Update - Nachdem ich versucht habe, die Befehle, die ich ausführen muss, in ein Shell-Skript einzufügen, konnte ich erfolgreich einen Bildschirm erstellen und die Befehle in diesem Bildschirm ausführen, aber ich bekomme das Verhalten, das auftritt, wenn das Skript nicht mehr ausgeführt wird Der Bildschirm wird ebenfalls geschlossen. Dies sollte kein Problem sein, da das Skript ein Protokollierungsskript ist, das nur mit dem Wissen des Sys-Administrators oder über das Skript, das ich zu entwickeln versuche, beendet werden sollte. Es wäre jedoch vorzuziehen, das Bildschirmsetup so zu gestalten, dass der Bildschirm angezeigt wird verschwindet nicht, wenn das Skript gestoppt wird. Ist es möglich, dieses Verhalten zu erreichen? **


1
Ich lief in das gleiche Problem und fand eine Lösung auf superuser.com für alle anderen , die auf dieses Problem stolpert superuser.com/questions/342463/...
Dan Herbert

Um den Bildschirm offen zu halten, können Sie Folgendes verwenden: screen bash -c 'echo "test"; / bin / bash '
gwyn

1
Für Ihr Problem mit dem automatischen Schließen können Sie eine spezielle Option verwenden, .screenrcdie die Zeile enthält zombie kr, in der ein fertiges Fenster geöffnet bleibt, und Sie können drücken k, um winodw zu schließen oder rden Befehl erneut im Fenster auszuführen. Ich habe dies für meine Standard .screenrc.
Martin C.

Antworten:


17

Ich denke, Sie könnten auf mehrere Probleme stoßen.

Wenn der Befehl vor dem erneuten Anhängen beendet wird, wird der Bildschirm ausgeblendet. Sie können dies demonstrieren, indem Sie verwenden:

screen -d -m ls -l

Der ls -lBefehl wird ausgeführt, aber screen -listnicht angezeigt, wenn der Bildschirmvorgang beendet ist.

Ich habe auch keine Ahnung, was Sie mit diesem \ 015-Zeug zu tun versuchen. Vielleicht hilft es, Ihre Frage zu aktualisieren, da Sie meines Erachtens mehrere Befehle in einer Bildschirmsitzung ausführen möchten. Dies sollte so einfach sein wie:

screen -d -m bash -c "command1 ; command2 ; command3"

Wenn diese häufig verwendet werden, sollten Sie vielleicht ein Shell-Skript erstellen, das nur diese Befehle ausführt, und dann ein einfacheres verwenden:

screen -d -m /path/to/script.sh

Gibt es eine Möglichkeit, ein ähnliches Verhalten zu erzielen, ohne dass sich der Bildschirm sofort löst? Angenommen, ich möchte eine SSH-Sitzung starten und mich anschließend sofort trennen. screen -d -m sshwird an der Passwortabfrage getrennt, bevor die Sitzung durchgeführt wird.
Bright-Star

Das funktioniert bei mir nicht. Das Ersetzen von "commandN" durch mehrere Programme mit langer Laufzeit führt dazu, dass in nichts angezeigt wird screen -list. Dies benennt den Bildschirm auch nicht, wie es das OP versucht.
Cerin

Ich wollte ein Python-Programm mit dieser Methode ausführen. Ich habe versucht, ein sh-Skript zu erstellen, um es auszuführen, aber den Bildschirm in der Liste nicht gesehen. Stattdessen habe ich verwendet screen -d -m python EventGenerator.py, was
super

1
Das sollte wohl bash -c "commands"stattbash "commands"
Marcovtwout

Du hast recht, es muss -c geben.
19.

8

Starten Sie einen getrennten Bildschirm

screen -dmS <screen name>

Führen Sie den Befehl in einem zuvor erstellten separaten Bildschirm aus

screen -S <screen name> -X stuff '<CMD>\n'

Ja, Sie müssen das Eingabe-Symbol eingeben, um den Befehl abzusenden. Andernfalls wird nur die Zeichenfolge zum Bildschirm hinzugefügt.

http://osdir.com/ml/gnu.screen/2003-09/msg00029.html


1
Was ist 'Zeug'?
Nadav B

stuffist eigentlich ein Befehl, der einen anderen Befehl in eine Bildschirmsitzung kopiert: stuff [string] Fügt den String string in den Eingabepuffer des aktuellen Fensters ein. Dies ist wie der Befehl "Einfügen", jedoch mit viel weniger Aufwand. Ohne Parameter fordert der Bildschirm zur Eingabe einer Zeichenfolge auf. Sie können mit dem Befehl "stuff" keine großen Puffer einfügen. Es ist am nützlichsten für Tastenbelegungen. Siehe auch "bindkey". [Zitiert von theterminallife.com/sending-commands-into-a-screen-session/]
Alisa

2

Ich bin bereits auf dieses Problem gestoßen, es war ein Fehler bei der Implementierung von Cygwin.

Ich habe ein ".screenrc_detaching" erstellt, das nur den folgenden Befehl enthält

#detach
detach 

und starten Sie den Bildschirm mit

screen -c ~/loginScripts/tempScreenrc/.screenrc_detaching

Dann haben Sie Ihre Bildschirmsitzung und es ist bereits verbunden und getrennt worden und Sie sind gut darin, Befehle zu pumpen.

Einfach ! : P


2

Dies hat den Job für mich erledigt, ohne zu -carbeiten

screen -d -m bash -c "command1; command2; command3"


1

Eine Möglichkeit, frühere Antworten zu testen, ist:

 # No sessions:
screen -ls

 # Returns immediately:
time screen -dmS screen_descritive_session_name  bash -c 'sleep 20; hostname >> /tmp/h'

 # New session present:
screen -ls

 # File with return of command was created :)
sleep 20; cat /tmp/h

Das erwartete Ergebnis sollte ungefähr so ​​aussehen:

No Sockets found in /var/run/screen/S-yourusernamehere.

(Das bedeutet, dass vorher keine Screen-Session erstellt wurde)

real    0m0.002s
user    0m0.000s
sys     0m0.000s

(Es ist die Zeit, die aufgewendet wird, um einen Bildschirm zu erstellen und sich von ihm zu lösen. Fast augenblicklich.)

There is a screen on:
    20318.screen_descritive_session_name    (20/08/2018 16:29:35)   (Detached)
1 Socket in /var/run/screen/S-yourusernamehere.

(In dieser Ausgabe werden die verfügbaren Bildschirmsitzungen angezeigt. Erstellt mit dem letzten Befehl.)

sleep 20; cat /tmp/h

(Dies catzeigt den in gnu-screen ausgeführten Hostnamen)


und was ist das ergebnis solcher tests?
Pierre.Vriens

Sie haben recht, es gab kein Beispiel. Ich werde hinzufügen.
Enrique S. Filiage

viel besser! merci! +1
Pierre.Vriens

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.