it-swarm-eu.dev

envoi de texte à un écran détaché

J'essaie d'exécuter un serveur minecraft sur mon serveur nonRAID.

Le serveur s'exécutera dans le shell, puis restera assis là à attendre l'entrée. Pour l'arrêter, je dois taper "stop" et appuyer sur Entrée, puis il sauvera le monde et quittera gracieusement, et je suis de retour dans le Shell. Cela fonctionne si je l'exécute via telnetting dans la boîte NAS, mais je veux l'exécuter directement sur la boîte.

voici ce que j'avais précédemment comme 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ù j'ai le Craftbukkit.jar et tous les fichiers du monde, etc. Si je tape directement cette ligne d'écran, l'écran s'installe séparément et le serveur se lance. Si j'exécute cette ligne à partir du script, il ne semble pas mettre en place un écran

pour arrêter le serveur, je dois "taper" en STOP puis appuyer sur Entrée. Mon approche était

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

envoyer à l'écran 'minecraft' le texte s-t-o-p 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 marche, puis tapez "stop" et il s'arrête correctement.

Le serveur fonctionne bien si je telnet et le fais manuellement, il suffit de l'exécuter sans être connecté à partir de mon ordinateur distant.

47
richard plumb

Je peux résoudre au moins une partie du problème: pourquoi la partie stop 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, donc une entrée envoyée plus tard avec screen -X stuff est juste perdu. 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 de toute façon, au cas où vous créeriez d'autres fenêtres dans cette session d'écran pour une raison quelconque.

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

(Traduction d'écran ^M à control-M qui est le caractère envoyé par le Enter clé.)

Le problème avec le démarrage de la session à partir d'un script est probablement lié à unMENU.

Tout d'abord, une note sur l'entrée facile de nouvelles lignes:

Juste un signe que la construction $() supprime les retours à la ligne 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 Enter frappe. Pendant le retour chariot que vous envoyez avec \r ne sera pas rayé, il existe plusieurs façons plus faciles d'entrer ce caractère sans avoir besoin de la commande supplémentaire.

  1. Vous pouvez placer une nouvelle ligne régulière dans vos guillemets doubles

    screen -S minecraft -X stuff "stop
    "
    
  2. Ou vous pouvez saisir le caractère sur une ligne de terminal en utilisant le Ctrl+vEnter séquence. Cela ressemblera à quelque chose comme ^M dans le terminal, mais il s'agit d'un caractère de nouvelle ligne spécial.

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

Deuxièmement, une note sur le comportement erratique de l'écran. ( Explication et solution par Gilles )

L'écran a un problème avec l'acceptation de l'entrée à une session d'écran qui n'a jamais été attachée. Si vous l'exécutez, il aura échoué:

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

Mais si vous exécutez cela, cela fonctionnera:

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

Enfin, vous pouvez utiliser le tmux bien mieux comporté au lieu de screen.

GNU-Screen est un multiplexeur de terminal de facto depuis de nombreuses années, mais il a longtemps cessé d'être développé et les bugs et bizarreries ne sont pas corrigés . Tmux est en cours de développement actif, comprend de nombreuses fonctionnalités que l'écran ne peut pas toucher, et son comportement hors de la boîte est plutôt plus intuitif. De plus, c'est mieux documenté. Voici comment convertir votre code:

# 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

Je m'excuse d'avoir déterré cet ancien message, mais cela m'aurait aidé dans mes efforts si ces informations avaient été disponibles au moment où j'ai eu un problème similaire. Il existe de nombreuses questions sur la façon d'envoyer des commandes d'écran dans un script bash. Comme pour le dépouillement de chat, cela peut être fait, mais j'aime cette façon. Avec cela, vous pouvez envoyer n'importe quelle commande ou dire n'importe quoi simplement en appelant la fonction 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"
...

C'est avec 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