J'essaie d'exécuter un serveur Minecraft sur mon serveur unRAID.
Le serveur s'exécutera dans le shell, puis attendra une entrée. Pour l'arrêter, je dois taper 'stop' et appuyer sur entrée. Le logiciel sauvera le monde et sortira avec élégance. Je suis de retour dans le shell. Tout cela fonctionne si je le lance via Telnetting dans la boîte NAS, mais je veux le lancer directement sur la boîte.
Voici ce que j’avais eu lors d’une première tentative:
#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 est le dossier où se trouvent Craftbukkit.jar et tous les fichiers du monde, etc. Si je tape directement cette ligne d'écran, la configuration de l'écran est détachée et le serveur se lance. Si j'exécute cette ligne depuis le script, il ne semble pas y avoir d'écran
pour arrêter le serveur, je dois «taper» dans STOP, puis appuyer sur Entrée. Mon approche était
screen -S minecraft -X stuff "stop $(echo -ne '\r')"
envoyer à l'écran 'minecraft' le texte et un retour chariot. Mais cela ne fonctionne pas, même si je le tape directement sur la ligne de commande. Mais si je «screen -r», je peux accéder à l'écran avec le serveur en cours d'exécution, puis taper «stop» et il s'arrête correctement.
Le serveur fonctionne bien si je me connecte par telnet et manuellement, il suffit de l’exécuter sans être connecté à partir de mon ordinateur distant.
la source
screen
n'a pas commencé? Essayez d’ajouterset -x
en haut du script (juste après la#!
ligne) et de signaler la sortie de trace lorsque vous exécutez le script.#!/bin/bash
etset -x
en haut du script, et nous montrer la sortie de trace à partir du script. Vous devrez peut-être consulter la documentation unMENU pour savoir où cette sortie est envoyée.Réponses:
Je peux résoudre au moins une partie du problème: pourquoi la
stop
partie ne fonctionne pas. Expérimentalement, lorsque vous démarrez une session Screen en mode détaché (screen -d -m
), aucune fenêtre n’est sélectionnée. Par conséquent, les entrées envoyées plus tard avecscreen -X stuff
sont simplement perdues. Vous devez spécifier explicitement que vous souhaitez envoyer les séquences de touches à la fenêtre 0 (-p 0
). C'est une bonne idée quand même, au cas où vous créeriez d'autres fenêtres dans cette session Screen pour quelque raison que ce soit.(L’écran est traduit
^M
en control-M qui est le caractère envoyé par la Enterclé.)Le problème lié au démarrage de la session à partir d'un script est probablement lié à unMENU.
la source
screen -d -m -S hi
, puis je lancescreen -S hi -p 0 -X stuff "cd <some_directory>^M"
et je n'obtiens rien en conséquence ... il envoie simplement "cd <répertoire_un>> M" sous forme de chaîne et n'interprète pas "^ M" en tant que clé d'entrée ...Tout d'abord, une note sur l'entrée facile des nouvelles lignes
Juste un avertissement que la
$()
construction supprime les nouvelles lignes de la sortie de la commande afin que les lignes de sortie puissent être utilisées comme arguments pour d'autres programmes. Cela peut provoquer un comportement inattendu. Dans ce cas, je suppose que vous essayez spécifiquement d’envoyer l’équivalent de la Enterfrappe au clavier. Bien que le retour à la ligne que vous envoyez\r
ne soit pas rayé, il existe plusieurs façons plus simples de saisir ce caractère sans avoir besoin de la commande supplémentaire.Vous pouvez placer une nouvelle ligne à l'intérieur de vos guillemets
Ou vous pouvez entrer le caractère dans une ligne de terminal en utilisant la séquence Ctrl+ v Enter. Cela ressemblera à quelque chose comme
^M
dans le terminal, mais c'est un caractère spécial de nouvelle ligne.Deuxièmement, une note sur le comportement erratique de l'écran. ( Explication et solution de Gilles )
Screen a un problème avec l'acceptation d'entrée dans une session d'écran qui n'a jamais été attachée. Si vous exécutez ceci, cela aura échoué:
Mais si vous exécutez ceci cela fonctionnera:
Enfin, vous pouvez utiliser le meilleur comportement
tmux
au lieu descreen
.GNU-Screen est un multiplexeur de facto depuis de nombreuses années, mais il a depuis longtemps cessé d'être développé et les bugs et les bizarreries ne sont pas corrigés. Tmux est en cours de développement, inclut de nombreuses fonctionnalités que l’écran ne peut pas toucher et son comportement immédiat est plutôt plus intuitif. En outre, c'est mieux documenté. Voici comment vous convertiriez votre code:
la source
screen -d -RR minecraft
?.screenrc
ou avez-vous un groupe de sessions d'écran défunkt ouvertes avec ce nom et envoyez-vous des données au mauvais?screen -list
?Je m'excuse d'avoir découvert cet ancien message, mais cela m'aurait aidé dans mes efforts si cette information avait été disponible au moment où j'ai eu un problème similaire. Il y a beaucoup de questions sur la façon d'envoyer des commandes d'écran dans un script bash. Comme avec la peau de chat, cela peut être fait, mais j'aime bien cette façon. Avec cela, vous pouvez envoyer n'importe quelle commande ou dire n'importe quoi simplement en appelant la fonction say_this.
C'est avec ssh!
la source