it-swarm.com.de

Senden von Texteingaben an einen getrennten Bildschirm

Ich versuche, einen Minecraft-Server auf meinem unRAID-Server auszuführen.

Der Server wird in der Shell ausgeführt und wartet dort auf Eingaben. Um es zu stoppen, muss ich 'stop' eingeben und die Eingabetaste drücken. Dann wird die Welt gerettet und ordnungsgemäß beendet, und ich bin wieder in der Shell. Das alles funktioniert, wenn ich es über Telnetting in die Box NAS) ausführe, aber ich möchte es direkt auf der Box ausführen.

dies ist, was ich zuvor als ersten Versuch hatte:

#define USER_SCRIPT_LABEL Start Minecraft server
#define USER_SCRIPT_DESCR Start minecraft server. needs sde2 mounted first
cd /mnt/disk/sde2/MCunraid
screen -d -m -S minecraft /usr/lib/Java/bin/Java -Xincgc -Xmx1024M -jar CraftBukkit.jar

MCunraid ist der Ordner, in dem ich die Datei Craftbukkit.jar und alle Dateien der Welt usw. habe. Wenn ich diese Bildschirmzeile direkt eingebe, wird der Bildschirm getrennt eingerichtet und der Server wird gestartet. Wenn ich diese Zeile innerhalb des Skripts ausführe, scheint es keinen Bildschirm einzurichten

um den Server zu stoppen, muss ich STOP eingeben und dann die Eingabetaste drücken. Mein Ansatz war

screen -S minecraft -X stuff "stop $(echo -ne '\r')"

um den Text s-t-o-p und einen Wagenrücklauf an den Bildschirm 'minecraft' zu senden. Aber das funktioniert nicht, auch wenn ich es direkt in die Kommandozeile eingebe. Aber wenn ich 'screen -r' mache, kann ich bei laufendem Server zum Bildschirm gelangen, dann tippe 'stop' und es wird ordnungsgemäß heruntergefahren.

Der Server läuft gut, wenn ich telnet und es manuell mache. Ich muss ihn nur ausführen, ohne von meinem Remotecomputer aus verbunden zu sein.

47
richard plumb

Ich kann zumindest einen Teil des Problems lösen: Warum funktioniert der Teil stop nicht? Experimentell wird beim Starten einer Bildschirmsitzung im getrennten Modus (screen -d -m) Kein Fenster ausgewählt, sodass die später mit screen -X stuff Gesendete Eingabe einfach verloren geht. Sie müssen explizit angeben, dass Sie die Tastenanschläge an Fenster 0 senden möchten (-p 0). Dies ist ohnehin eine gute Idee, falls Sie aus irgendeinem Grund andere Fenster in dieser Bildschirmsitzung erstellen.

screen -S minecraft -p 0 -X stuff "stop^M"

(Bildschirmübersetzung ^M In Control-M, das von der Enter Schlüssel.)

Das Problem beim Starten der Sitzung über ein Skript hängt wahrscheinlich mit unMENU zusammen.

Zunächst ein Hinweis zum einfachen Eingeben von Zeilenumbrüchen:

Nur ein Hinweis darauf, dass das Konstrukt $() Zeilenumbrüche aus der Befehlsausgabe entfernt, damit die Ausgabezeilen als Argumente für andere Programme verwendet werden können. Dies kann zu unerwartetem Verhalten führen. In diesem Fall gehe ich davon aus, dass Sie speziell versuchen, das Äquivalent von zu senden Enter Tastenanschlag. Während des Wagenrücklaufs senden Sie mit \r wird nicht gestreift, es gibt mehrere einfachere Möglichkeiten, dieses Zeichen einzugeben, ohne dass ein zusätzlicher Befehl erforderlich ist.

  1. Sie können einen regulären Zeilenumbruch in Ihre doppelten Anführungszeichen setzen

    screen -S minecraft -X stuff "stop
    "
    
  2. Oder Sie können das Zeichen in eine Terminalzeile mit dem eingeben Ctrl+vEnter Reihenfolge. Dies sieht ungefähr so ​​aus wie ^M im Terminal, aber es ist ein spezielles Zeilenumbruchzeichen.

    screen -S minecraft -X stuff "stop^M"
    

Zweitens ein Hinweis zum unregelmäßigen Bildschirmverhalten. ( Erklärung und Lösung von Gilles )

Bildschirm hat ein Problem beim Akzeptieren von Eingaben in eine Bildschirmsitzung, die noch nie angehängt wurde. Wenn Sie dies ausführen, ist es fehlgeschlagen:

screen -d -m -S minecraft zsh
screen -S minecraft -X stuff "stop^M"
screen -r minecraft

Aber wenn Sie dies ausführen, wird es funktionieren:

screen -d -m -S minecraft zsh
screen -r minecraft (then disconnect with Ctrl-a-d)
screen -S minecraft -X stuff "stop^M"
screen -r minecraft

Schließlich könnten Sie das viel besser benommene tmux anstelle von screen verwenden.

GNU-Screen ist seit vielen Jahren ein de-facto Terminal-Multiplexer, aber es wurde lange nicht mehr entwickelt und Fehler und Macken werden nicht behoben . Tmux befindet sich in der aktiven Entwicklung, enthält viele Funktionen, die der Bildschirm nicht berühren kann, und sein sofort einsatzbereites Verhalten ist intuitiver. Es ist auch besser dokumentiert. So würden Sie Ihren Code konvertieren:

# Start new detached tmux session with a named window pane running the Java app
tmux new-session -d -n minecraft /usr/lib/Java/bin/Java [args]

# Send it keys to stop the mincraft server
tmux send-keys -t minecraft "stop^M"
25
Caleb

Ich entschuldige mich dafür, dass ich diesen alten Beitrag ausgegraben habe, aber dies hätte mir bei meinen Bemühungen geholfen, wenn diese Informationen zu dem Zeitpunkt verfügbar gewesen wären, als ich ein ähnliches Problem hatte. Es gibt viele Fragen zum Senden von Bildschirmbefehlen in einem Bash-Skript. Wie beim Häuten von Katzen kann dies getan werden, aber ich mag diesen Weg. Mit diesem können Sie jeden Befehl senden oder etwas sagen, indem Sie einfach die Funktion say_this aufrufen.

#!/bin/bash

say_this()
{
    screen -S minecraft -p 0 -X stuff "$1^M"
}

say_this "say Saving world"
say_this "save-off"
say_this "save-all"
...

Das ist mit ssh!

#!/bin/bash

say_this()
{
    # Dont forget to set NAME or whatever
    ssh -p 8989 192.168.1.101 screen -S $NAME -p 0 -X stuff \"$1^M\"
}

say_this "say test"
say_this "say [email protected]#$%^&*()<>?This string will work!"
5
fuzzyfreak