Je peux résoudre au moins une partie du problème :pourquoi le stop
une 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, donc entrée envoyée plus tard avec screen -X stuff
est juste perdu. Vous devez spécifier explicitement que vous souhaitez envoyer les frappes à 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 Screen pour une raison quelconque.
screen -S minecraft -p 0 -X stuff "stop^M"
(Traduction de l'écran ^M
à control-M qui est le caractère envoyé par la Entrée clé.)
Le problème de démarrage de la session à partir d'un script est probablement lié à unMENU.
Tout d'abord, une note sur la facilité de saisie des retours à la ligne :
Juste un avertissement que le $()
construct 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 entraîner un comportement inattendu. Dans ce cas, je suppose que vous essayez spécifiquement d'envoyer l'équivalent de Enter frappe. Alors que le retour chariot que vous envoyez avec \r
ne sera pas rayé, il existe plusieurs façons plus simples d'entrer ce caractère sans avoir besoin de la commande supplémentaire.
-
Vous pouvez placer une nouvelle ligne régulière à l'intérieur de vos guillemets doubles
screen -S minecraft -X stuff "stop "
-
Ou vous pouvez entrer le caractère dans une ligne de terminal en utilisant la touche Ctrl +v Entrez séquence. Cela ressemblera à quelque chose comme
^M
dans le terminal, mais c'est un caractère de saut de 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 des entrées dans une session d'écran qui n'a jamais été jointe. Si vous exécutez ceci, cela aura échoué :
screen -d -m -S minecraft zsh
screen -S minecraft -X stuff "stop^M"
screen -r minecraft
Mais si vous lancez ceci, 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 bien meilleur comportement tmux
au lieu de screen
.
GNU-Screen a été de facto multiplexeur terminal depuis de nombreuses années, mais il a depuis longtemps cessé d'être développé et les bogues et les 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 prêt à l'emploi 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"
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'avais 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épeçage 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!"