Próbuję uruchomić serwer Minecraft na moim serwerze unRAID.
Serwer będzie działał w powłoce, a następnie siedział tam i czeka na dane wejściowe. Aby go zatrzymać, muszę wpisać „stop” i nacisnąć Enter, a następnie uratuje świat i z wdziękiem wyjdzie, a ja wrócę do powłoki. To wszystko działa, jeśli uruchomię to przez telnetting do urządzenia NAS, ale chcę uruchomić to bezpośrednio na urządzeniu.
oto, co wcześniej miałem za pierwszą próbą:
#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 jest folderem, w którym mam plik Craftbukkit.jar i wszystkie pliki świata itp. Po wpisaniu bezpośrednio tej linii ekranu ekran zostanie odłączony i serwer zostanie uruchomiony. Jeśli wykonam ten wiersz ze skryptu, wydaje się, że nie ustawiam ekranu
aby zatrzymać serwer, muszę „wpisać” w STOP, a następnie nacisnąć enter. Moje podejście było
screen -S minecraft -X stuff "stop $(echo -ne '\r')"
aby wysłać na ekran „minecrafta” zatrzymanie tekstu i powrót karetki. Ale to nie działa, nawet jeśli wpisuję go bezpośrednio w linii poleceń. Ale jeśli wykonam polecenie „screen -r”, mogę przejść do ekranu z uruchomionym serwerem, a następnie wpisać „stop” i nastąpi prawidłowe zamknięcie.
Serwer działa dobrze, jeśli telnet się i zrobię to ręcznie, wystarczy uruchomić go bez połączenia z komputerem zdalnym.
źródło
screen
nie udało się uruchomić? Spróbuj dodaćset -x
na górze skryptu (tuż po#!
wierszu) i zgłoś wyniki śledzenia po uruchomieniu skryptu.#!/bin/bash
iset -x
na początku skryptu, i pokazać nam wyjście śledzenia ze skryptu. Konieczne może być przejrzenie dokumentacji unMENU, aby dowiedzieć się, dokąd trafia ten wynik.Odpowiedzi:
Potrafię rozwiązać przynajmniej część problemu: dlaczego ta
stop
część nie działa. Eksperymentalnie po uruchomieniu sesji ekranu w trybie odłączonym (screen -d -m
) nie jest wybierane żadne okno, więc dane przesłane późniejscreen -X stuff
są po prostu tracone. Musisz jawnie określić, że chcesz wysyłać naciśnięcia klawiszy do okna 0 (-p 0
). To i tak jest dobry pomysł, na wypadek, gdyby z jakiegoś powodu zdarzyło Ci się tworzyć inne okna w tej sesji ekranu.(Tłumaczenie ekranu
^M
na control-M, czyli znak wysłany przez Enterklawisz.)Problem z uruchomieniem sesji ze skryptu jest prawdopodobnie związany z unMENU.
źródło
screen -d -m -S hi
a następnie uruchomiłemscreen -S hi -p 0 -X stuff "cd <some_directory>^M"
i nic nie otrzymałem w wyniku ... wysyła po prostu „cd <katalog_>> M” jako ciąg znaków i nie interpretuje „^ M” jako klawisza Enter ...Po pierwsze, uwaga na temat łatwego wprowadzania nowych linii:
Tylko jedna głowa do góry, że
$()
konstrukcja usuwa nowe wiersze z wyjścia polecenia, dzięki czemu wiersze wyjściowe mogą być użyte jako argumenty dla innych programów. Może to spowodować nieoczekiwane zachowanie. W tym przypadku zakładam, że konkretnie próbujesz wysłać odpowiednik Enternaciśnięcia klawisza. Chociaż zwrot karetki, który wysyłasz\r
, nie zostanie rozłożony, istnieje kilka łatwiejszych sposobów na wejście do tej postaci bez potrzeby dodatkowego polecenia.W podwójnych cudzysłowach możesz umieścić regularny znak nowej linii
Lub możesz wprowadzić znak w linii terminalu, używając sekwencji Ctrl+ v Enter. Będzie to wyglądać jak
^M
w terminalu, ale jest to specjalny znak nowej linii.Po drugie, uwaga na temat błędnego zachowania ekranu. ( Wyjaśnienie i rozwiązanie Gilles )
Wystąpił problem z akceptacją danych wejściowych do sesji ekranu, która nigdy nie została dołączona. Jeśli uruchomisz to, to się nie powiedzie:
Ale jeśli to uruchomisz, zadziała:
Na koniec możesz użyć znacznie lepiej zachowanego
tmux
zamiastscreen
.GNU-Screen jest de facto multiplekserem terminali od wielu lat, ale już dawno przestał być rozwijany, a błędy i dziwactwa się nie naprawiają. Tmux jest w fazie rozwoju, zawiera wiele funkcji, których ekran nie może dotknąć, a jego zachowanie po wyjęciu z pudełka jest raczej bardziej intuicyjne. Ponadto jest lepiej udokumentowany. Oto jak przekonwertowałbyś swój kod:
źródło
screen -d -RR minecraft
?.screenrc
lub masz otwartą serię nieefektywnych sesji ekranowych o tej nazwie, więc wysyłasz dane do niewłaściwej?screen -list
?Przepraszam za wykopanie tego starego postu, ale pomogłoby mi to w moich staraniach, gdyby te informacje były dostępne w czasie, gdy miałem podobny problem. Istnieje wiele pytań dotyczących wysyłania poleceń ekranowych w skrypcie bash. Tak jak w przypadku skórowania kota, można to zrobić, ale podoba mi się to w ten sposób. Dzięki temu możesz wysłać dowolne polecenie lub powiedzieć cokolwiek, wywołując funkcję say_this.
To jest z ssh!
źródło