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, und dann wird die Welt gerettet und ich bin wieder in der Shell. Das alles funktioniert, wenn ich es per Telnetting in die NAS-Box starte, es aber direkt auf der Box ausführen möchte.
Das hatte ich vorher als ersten Versuch:
#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 das Craftbukkit.jar und alle Weltdateien usw. habe. Wenn ich diese Bildschirmzeile direkt eingebe, wird der Bildschirm getrennt eingerichtet und der Server gestartet. Wenn ich diese Zeile innerhalb des Skripts ausführe, scheint sie keinen Bildschirm einzurichten
Zum Stoppen des Servers muss ich STOP 'eingeben' und dann die Eingabetaste drücken. Mein Ansatz war
screen -S minecraft -X stuff "stop $(echo -ne '\r')"
Senden Sie auf dem Bildschirm 'minecraft' den Text Stop und einen Wagenrücklauf. Aber das funktioniert nicht, auch wenn ich es direkt in die Befehlszeile eingebe. Aber wenn ich 'screen -r' bekomme, wenn der Server läuft, dann tippe 'stop' und es wird richtig heruntergefahren.
Der Server läuft gut, wenn ich telnete und es manuell mache, muss es nur laufen, ohne von meinem entfernten Computer verbunden zu sein.
quelle
screen
nicht funktioniert hat ? Versuchen Sie,set -x
am oberen Rand des Skripts (direkt nach der#!
Zeile) einzufügen und die Ablaufverfolgungsausgabe zu melden, wenn Sie das Skript ausführen.#!/bin/bash
undset -x
an der Spitze des Skripts, und zeigen uns die Trace - Ausgabe aus dem Skript. Möglicherweise müssen Sie in der unMENU-Dokumentation nachsehen, wo diese Ausgabe hingeht.Antworten:
Ich kann zumindest einen Teil des Problems lösen: Warum
stop
funktioniert der Teil nicht? Experimentell wird beim Starten einer Bildschirmsitzung im getrennten Modus (screen -d -m
) kein Fenster ausgewählt, sodass später mit gesendete Eingabenscreen -X stuff
einfach verloren gehen. Sie müssen explizit angeben, dass Sie die Tastenanschläge an Fenster 0 (-p 0
) senden möchten . Dies ist auf jeden Fall eine gute Idee, falls Sie in dieser Bildschirmsitzung aus irgendeinem Grund andere Fenster erstellen.(Bildschirmübersetzung
^M
nach Control-M, dem von der EnterTaste gesendeten Zeichen .)Das Problem beim Starten der Sitzung über ein Skript hängt wahrscheinlich mit unMENU zusammen.
quelle
screen -d -m -S hi
und dann ausgeführtscreen -S hi -p 0 -X stuff "cd <some_directory>^M"
und erhalte nichts als Ergebnis ... er sendet nur "cd <some_directory> ^ M" als Zeichenfolge und interpretiert "^ M" nicht als Eingabetaste ...Zunächst ein Hinweis zur einfachen Eingabe von Zeilenumbrüchen:
Nur eine
$()
Bemerkung , dass das Konstrukt Zeilenumbrüche aus der Ausgabe des Befehls 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 EnterTastenanschlag zu senden . Während der Wagenrücklauf, mit dem Sie senden\r
, nicht gestreift wird, gibt es mehrere einfachere Möglichkeiten, dieses Zeichen einzugeben, ohne den zusätzlichen Befehl zu benötigen.Sie können in Ihre doppelten Anführungszeichen einen regulären Zeilenumbruch einfügen
Oder Sie geben das Zeichen mit der Ctrl+ v Enter-Sequenz in eine Terminalzeile ein . Das sieht
^M
im Terminal ungefähr so aus, ist aber ein spezieller Newline-Charakter.Zweitens: Ein Hinweis zum fehlerhaften Bildschirmverhalten. ( Erklärung und Lösung von Gilles )
Bildschirm hat ein Problem mit dem Akzeptieren von Eingaben in eine Bildschirmsitzung, die noch nie angehängt wurde. Wenn Sie dies ausführen, ist dies fehlgeschlagen:
Aber wenn Sie dies ausführen, wird es funktionieren:
Zum Schluss könntest du die viel besser benommenen
tmux
anstatt benutzenscreen
.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. Es enthält viele Funktionen, die der Bildschirm nicht berühren kann, und das Verhalten ist intuitiver. Außerdem ist es besser dokumentiert. So würden Sie Ihren Code konvertieren:
quelle
screen -d -RR minecraft
?.screenrc
oder Sie haben eine Reihe von Defunkt-Screen-Sessions mit diesem Namen geöffnet, und Sie senden Daten an die falsche Adresse?screen -list
?Ich entschuldige mich für das Ausgraben dieses alten Postens, 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 Katzenhäuten mag dies geschehen, aber ich mag es so. Mit diesem können Sie jeden Befehl senden oder irgendetwas sagen, indem Sie die Funktion say_this aufrufen.
Das ist mit ssh!
quelle