it-swarm-eu.dev

odeslání textového vstupu na oddělenou obrazovku

Snažím se spustit minecraft server na mém unRAID serveru.

Server poběží v prostředí Shell a pak tam bude čekat na vstup. Abych to zastavil, musím napsat 'stop' a stisknout enter, a pak to zachrání svět a elegantně vystoupí a já jsem zpět ve skořápce. To vše funguje, když spustím přes telnetting do pole NAS), ale chci to spustit přímo na krabici.

to je to, co jsem předtím měl jako první pokus:

#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 je složka, ve které mám soubor Craftbukkit.jar a všechny světové soubory atd. Pokud zadám tento řádek obrazovky přímo, obrazovka se odpojí a server se spustí. Pokud spustím tento řádek ze skriptu, nezdá se, že by nastavil obrazovku

pro zastavení serveru potřebuji „napsat“ v STOP a pak stisknout enter. Můj přístup byl

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

poslat na obrazovku „minecraft“ text s-t-o-p a návrat vozíku. Ale to nefunguje, i když to napíšu přímo na příkazový řádek. Ale pokud jsem 'screen -r', mohu se dostat na obrazovku se spuštěným serverem, pak napište 'stop' a vypne se správně.

Server funguje dobře, pokud se připojím a připojím se ručně, stačí jej spustit, aniž by byl připojen ze vzdáleného počítače.

47
richard plumb

Dokážu vyřešit alespoň část problému: proč část stop nefunguje. Experimentálně, když zahájíte relaci obrazovky v odpojeném režimu (screen -d -m), není vybráno žádné okno, takže vstup později odeslán s screen -X stuff je právě ztraceno. Musíte explicitně určit, že chcete posílat stisky kláves do okna 0 (-p 0). V každém případě je to dobrý nápad pro případ, že z této relace obrazovky z jakéhokoli důvodu vytvoříte další okna.

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

(Přeložit obrazovku ^M to control-M, což je znak odeslaný pomocí Enter klíč.)

Problém se spuštěním relace ze skriptu pravděpodobně souvisí s unMENU.

Nejprve poznámka o snadném zadávání nových řádků:

Jen heads up, že konstrukce $() stripuje nové řádky z výstupu příkazu, takže výstupní řádky mohou být použity jako argumenty pro jiné programy. To může způsobit neočekávané chování. V tomto případě předpokládám, že se konkrétně pokoušíte poslat ekvivalent Enter stisknutí klávesy. Během návratu vozíku posíláte pomocí \r se nedostane pruhovaný, existuje několik jednodušších způsobů, jak zadat tento znak bez nutnosti dalšího příkazu.

  1. Do svých uvozovek můžete vložit pravidelný nový řádek

    screen -S minecraft -X stuff "stop
    "
    
  2. Nebo můžete vložit znak do řádku terminálu pomocí Ctrl+vEnter sekvence. Bude to vypadat jako ^M v terminálu, ale je to speciální znak nového řádku.

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

Za druhé, poznámka o nestabilním chování obrazovky. ( Vysvětlení a řešení Gillesem )

Na obrazovce je problém s přijetím vstupu do relace obrazovky, která nebyla nikdy připojena. Pokud toto spustíte, selže:

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

Ale pokud to spustíte, bude to fungovat:

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

Nakonec můžete použít mnohem lépe chované tmux místo screen.

GNU-Screen je de-facto terminálový multiplexor po mnoho let, ale již dlouho se vyvíjí a chyby a vtípky se neopravují . Tmux je v aktivním vývoji, obsahuje mnoho funkcí, kterých se obrazovka nemůže dotknout, a jeho chování mimo krabici je spíše intuitivnější. Také je to lépe zdokumentováno. Postup převodu kódu:

# 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

Omlouvám se za vykopání tohoto starého příspěvku, ale toto by mi pomohlo v mém úsilí, kdyby tyto informace byly k dispozici v době, kdy jsem měl podobný problém. Existuje mnoho otázek o tom, jak posílat příkazy obrazovky v bash skriptu. Stejně jako u kočičí kůže se to může stát, ale líbí se mi to. S tímto můžete poslat jakýkoli příkaz nebo říct cokoli pouhým zavoláním funkce say_this.

#!/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"
...

To je 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