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? **
quelle
.screenrc
die die Zeile enthältzombie kr
, in der ein fertiges Fenster geöffnet bleibt, und Sie können drückenk
, um winodw zu schließen oderr
den Befehl erneut im Fenster auszuführen. Ich habe dies für meine Standard .screenrc.Antworten:
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:
Der
ls -l
Befehl wird ausgeführt, aberscreen -list
nicht 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:
Wenn diese häufig verwendet werden, sollten Sie vielleicht ein Shell-Skript erstellen, das nur diese Befehle ausführt, und dann ein einfacheres verwenden:
quelle
screen -d -m ssh
wird an der Passwortabfrage getrennt, bevor die Sitzung durchgeführt wird.screen -list
. Dies benennt den Bildschirm auch nicht, wie es das OP versucht.screen -d -m python EventGenerator.py
, wasbash -c "commands"
stattbash "commands"
Starten Sie einen getrennten Bildschirm
Führen Sie den Befehl in einem zuvor erstellten separaten Bildschirm aus
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
quelle
stuff
ist 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/]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
und starten Sie den Bildschirm mit
Dann haben Sie Ihre Bildschirmsitzung und es ist bereits verbunden und getrennt worden und Sie sind gut darin, Befehle zu pumpen.
Einfach ! : P
quelle
Dies hat den Job für mich erledigt, ohne zu
-c
arbeitenscreen -d -m bash -c "command1; command2; command3"
quelle
Eine Möglichkeit, frühere Antworten zu testen, ist:
Das erwartete Ergebnis sollte ungefähr so aussehen:
(Das bedeutet, dass vorher keine Screen-Session erstellt wurde)
(Es ist die Zeit, die aufgewendet wird, um einen Bildschirm zu erstellen und sich von ihm zu lösen. Fast augenblicklich.)
(In dieser Ausgabe werden die verfügbaren Bildschirmsitzungen angezeigt. Erstellt mit dem letzten Befehl.)
(Dies
cat
zeigt den in gnu-screen ausgeführten Hostnamen)quelle
quelle