Frage Erstellen Sie einen Bildschirm und führen Sie den Befehl aus, ohne ihn anzuhängen


Ich arbeite daran, eine Wartungsroutine zu automatisieren, bei der ein Skript gestartet und gestoppt wird, das in einer Bildschirmsitzung ausgeführt wird. Mein Ansatz besteht darin, die Bildschirmsitzung zu beenden und dann neu zu starten und den Befehl innerhalb eines Skripts auszuführen, wobei die Fähigkeiten zum Erstellen eines Bildschirms und zum Übergeben eines Befehls verwendet werden, ohne dass der Bildschirm angefügt werden muss.

Ich habe jedoch Schwierigkeiten damit. Ich kann den Bildschirm korrekt erstellen, ohne ihn anzuhängen screen -d -m -S screen_name. Wenn ich jedoch einen Befehl auf Basis von ausführen:

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

mit dem Echo -ne '\ 015' wird mit Backticks anstelle von einfachen Anführungszeichen umhüllt. Es simuliert den Benutzer, der die Enter-Taste drückt, während sich die Befehle, die ich verwende, in ein Verzeichnis bewegen und dort ein Skript ausführen. Dieser Befehl funktioniert nur, wenn der Bildschirm nach der Erstellung angehängt wurde. Während ich versuche, den Prozess der Erstellung des Bildschirms und die Ausführung der darin enthaltenen Befehle zu automatisieren, möchte ich vermeiden, dass ich innerhalb eines Skripts anfügen und trennen muss. Ich werde den Vorschlag machen, ein Shell-Skript zu erstellen, das die Befehle enthält, die ich innerhalb des Bildschirms ausführen und entsprechend 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 an den Bildschirm anzuhängen?

Danke im Voraus.

** Update - nachdem ich den Vorschlag ausprobiert habe, die Befehle zu platzieren, die ich innerhalb eines Shell-Skripts ausführen muss, konnte ich erfolgreich einen Bildschirm erstellen und die Befehle auf dem Bildschirm ausführen, aber ich bekomme das Verhalten, wenn das Skript nicht mehr läuft Der Bildschirm schließt sich ebenfalls. Dies sollte kein Problem sein, da das Skript ein Logging-Skript ist, das nur mit dem Wissen des sys admin oder durch das Skript, das ich entwickeln möchte, aufhört. Es wäre jedoch vorzuziehen, den Bildschirm so einzurichten, dass der Bildschirm angezeigt wird verschwindet nicht, wenn das Skript gestoppt wird. Ist es möglich, dieses Verhalten zu erreichen? **


25
2018-01-20 16:32


Ursprung


Ich stieß auf das gleiche Problem und fand eine Lösung auf superuser.com für alle anderen, die auf dieses Problem stolpern superuser.com/questions/342463/ ... - Dan Herbert
Um den Bildschirm offen zu halten, könnten Sie etwas wie folgt verwenden: screen bash -c 'echo "test"; / bin / bash ' - gwyn
Für Ihr automatisch schließendes Problem könnten Sie ein spezielles verwenden .screenrc das enthält die Zeile zombie kr, die ein fertiges Fenster geöffnet hält, und Sie können drücken k um den Winodw zu schließen, oder r um den Befehl erneut im Fenster auszuführen. Ich habe das für meinen Standard .screenrc. - Martin C.


Antworten:


Ich denke, dass Sie auf einige Probleme stoßen.

Wenn der Befehl abgeschlossen ist, bevor Sie ihn erneut anfügen, verschwindet der Bildschirm. Sie können dies demonstrieren, indem Sie Folgendes verwenden:

screen -d -m ls -l

Es wird laufen ls -l Befehl, aber screen -list zeigt es nicht an, da der Bildschirmprozess beendet wurde.

Ich habe auch keine Ahnung, was Sie mit diesem Zeug zu tun versuchen. Vielleicht hilft das Aktualisieren Ihrer Frage, denn ich glaube, Sie versuchen, mehrere Befehle in einer Bildschirmsitzung auszuführen. 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

17
2018-01-20 16:43



Gibt es eine Möglichkeit, ein ähnliches Verhalten zu erreichen, ohne dass sich der Bildschirm sofort löst? Angenommen, ich möchte eine SSH-Sitzung starten und anschließend direkt danach trennen. screen -d -m ssh wird bei der Passwortabfrage vor der Sitzung getrennt. - bright-star
Das funktioniert nicht für mich. Wenn Sie "commandN" durch mehrere lang laufende Programme ersetzen, wird nichts angezeigt screen -list. Außerdem wird der Bildschirm nicht benannt, wie das OP versucht. - Cerin
Ich wollte mit dieser Methode ein Python-Programm ausführen. Ich habe versucht, ein SH-Skript zu erstellen, um es auszuführen, aber den Bildschirm in der Liste nicht angezeigt. Stattdessen habe ich gebraucht screen -d -m python EventGenerator.pyDas hat super funktioniert - Dan Ciborowski - MSFT
Das sollte wahrscheinlich sein bash -c "commands" anstatt bash "commands" - marcovtwout
Du hast recht, da muss -c sein. - Xdg


Starten Sie einen getrennten Bildschirm

screen -dmS <screen name>

Führt den Befehl im zuvor erstellten Bildschirm mit getrennten Ansichten aus

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

Ja, Sie müssen das Enter-Symbol eingeben, um den Befehl zu senden, sonst wird nur die Zeichenfolge zum Bildschirm hinzugefügt.

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


4
2018-03-04 11:56





Ich habe dieses Problem schon einmal gesehen, es war ein Fehler bei der Cygwin-Implementierung.

Was ich gemacht habe, war ein ".screenrc_detaching" zu erstellen, das nur den folgenden Befehl hat

#detach
detach 

und dann Bildschirm mit starten

screen -c ~/loginScripts/tempScreenrc/.screenrc_detaching

Dann hast du deine Bildschirmsitzung und sie ist bereits angeschlossen und gelöst und du bist gut darin Befehle zu pumpen.

Einfach ! : P


2
2017-11-04 14:49





Das hat die Arbeit für mich erledigt, ohne -c hat nicht funktioniert

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


2
2017-09-12 10:04





Ein Copy'n'Paste Weg, um vorherige 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 ähnlich sein wie:

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

(Das bedeutet, dass zuvor keine Bildschirmsitzung erstellt wurde)

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

(Es ist die Zeit, die man benötigt, um einen Bildschirm zu erstellen und sich von diesem 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.

(Diese Ausgabe zeigt Bildschirmsitzungen an. Erstellt am letzten Befehl.)

sleep 20; cat /tmp/h

(Diese cat Zeigt den Hostnamen, der im Gnu-Screen ausgeführt wird)


1
2017-08-17 17:24



und was ist das Ergebnis solcher Tests? - Pierre.Vriens
Du hast Recht, es gab kein Beispiel. Ich werde hinzufügen. - Enrique S. Filiage
viel besser! Merci! +1 - Pierre.Vriens