Puedo resolver al menos parte del problema:por qué el stop
parte no funciona. Experimentalmente, cuando inicia una sesión de pantalla en modo separado (screen -d -m
), no se selecciona ninguna ventana, por lo que la entrada se envía más tarde con screen -X stuff
simplemente se pierde. Debe especificar explícitamente que desea enviar las pulsaciones de teclas a la ventana 0 (-p 0
). Esta es una buena idea de todos modos, en caso de que cree otras ventanas en esa sesión de pantalla por cualquier motivo.
screen -S minecraft -p 0 -X stuff "stop^M"
(Traducción de pantalla ^M
a control-M que es el caracter enviado por Enter clave.)
El problema de iniciar la sesión desde un script probablemente esté relacionado con unMENU.
Primero, una nota sobre cómo ingresar líneas nuevas fácilmente:
Solo un aviso de que el $()
build elimina las líneas nuevas de la salida del comando para que las líneas de salida se puedan usar como argumentos para otros programas. Esto puede causar un comportamiento inesperado. En este caso, asumo que está tratando específicamente de enviar el equivalente a Enter pulsación de tecla Mientras que el retorno de carro que está enviando con \r
no quedará rayado, hay varias formas más fáciles de ingresar ese carácter sin necesidad de un comando adicional.
-
Puede colocar una nueva línea regular dentro de sus comillas dobles
screen -S minecraft -X stuff "stop "
-
O puede ingresar el carácter en una línea terminal usando Ctrl +v Entrar secuencia. Esto se verá como
^M
en la terminal, pero es un carácter de nueva línea especial.screen -S minecraft -X stuff "stop^M"
En segundo lugar, una nota sobre el comportamiento errático de la pantalla. (Explicación y solución de Gilles)
La pantalla tiene un problema al aceptar entradas en una sesión de pantalla que nunca se ha adjuntado. Si ejecuta esto, habrá fallado:
screen -d -m -S minecraft zsh
screen -S minecraft -X stuff "stop^M"
screen -r minecraft
Pero si ejecutas esto, funcionará:
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
Por último, podrías usar el mucho mejor comportamiento tmux
en lugar de screen
.
GNU-Screen ha sido un de facto multiplexor de terminal durante muchos años, pero hace tiempo que dejó de desarrollarse y los errores y peculiaridades no se solucionan. Tmux está en desarrollo activo, incluye muchas funciones que la pantalla no puede tocar y su comportamiento listo para usar es bastante más intuitivo. Además, está mejor documentado. Así es como convertiría su código:
# 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"
Pido disculpas por desenterrar esta publicación anterior, pero esto me habría ayudado en mis esfuerzos si esta información hubiera estado disponible en el momento en que tuve un problema similar. Hay muchas preguntas sobre cómo enviar comandos de pantalla en un script bash. Al igual que con el desollado de gatos, esto se puede hacer, pero me gusta de esta manera. Con esto puedes enviar cualquier comando o decir cualquier cosa simplemente llamando a la función 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"
...
¡Esto es con 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!"