Mohu vyřešit alespoň část problému:proč stop
část nefunguje. Experimentálně, když spustíte relaci obrazovky v odděleném režimu (screen -d -m
), není vybráno žádné okno, takže vstup bude odeslán později s screen -X stuff
je prostě ztracen. Musíte explicitně určit, že chcete posílat úhozy do okna 0 (-p 0
). To je každopádně dobrý nápad pro případ, že z nějakého důvodu vytvoříte v této relaci obrazovky další okna.
screen -S minecraft -p 0 -X stuff "stop^M"
(Překlad obrazovky ^M
na control-M, což je znak odeslaný 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 upozornění, že $()
konstrukt odřízne nové řádky z výstupu příkazu, takže výstupní řádky lze použít 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 odeslat ekvivalent Enter stisknutí klávesy. Zatímco návrat vozíku odesíláte s \r
nebude pruhovaný, existuje několik snadnějších způsobů, jak zadat tento znak bez potřeby dalšího příkazu.
-
Do dvojitých uvozovek můžete umístit běžný nový řádek
screen -S minecraft -X stuff "stop "
-
Nebo můžete znak zadat do terminálového řádku pomocí Ctrl +v Zadejte sekvence. Bude to vypadat nějak 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 k nevyzpytatelnému chování obrazovky. (Vysvětlení a řešení Gilles)
Obrazovka má problém s přijetím vstupu do relace obrazovky, která nebyla nikdy připojena. Pokud toto spustíte, dojde k selhání:
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 fungující tmux
místo screen
.
GNU-Screen byl de-facto terminálový multiplexer již mnoho let, ale již dávno není vyvíjen a chyby a vtípky se neopravují. Tmux je v aktivním vývoji, obsahuje mnoho funkcí, kterých se obrazovka nedotkne, a jeho chování po vybalení je spíše intuitivní. Navíc je to lépe zdokumentované. Zde je návod, jak převést kód:
# 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"
Omlouvám se za vykopání tohoto starého příspěvku, ale pomohlo by mi to v mém úsilí, kdyby byly tyto informace dostupné v době, kdy jsem měl podobný problém. Existuje mnoho otázek o tom, jak odesílat příkazy obrazovky ve skriptu bash. Stejně jako u kočičí kůže to může být provedeno, ale mám rád tento způsob. S tímto můžete odeslat jakýkoli příkaz nebo říci cokoliv pouhým volá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"
...
Toto je s 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!"