Estoy tratando de ejecutar un servidor de Minecraft en mi servidor no RAID.
El servidor se ejecutará en el shell y luego se sentará allí esperando la entrada. Para detenerlo, necesito escribir 'detener' y presionar enter, y luego salvará el mundo y saldrá con gracia, y estoy de vuelta en el shell. Todo eso funciona si lo ejecuto a través de Telnet en la caja NAS, pero quiero ejecutarlo directamente en la caja.
Esto es lo que tuve previamente como primer intento:
#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 es la carpeta donde tengo el Craftbukkit.jar y todos los archivos del mundo, etc. Si escribo esa línea de pantalla directamente, la pantalla se desconecta y el servidor se inicia. Si ejecuto esa línea desde el script, no parece configurar una pantalla
para detener el servidor, necesito 'escribir' en STOP y luego presionar enter. Mi enfoque fue
screen -S minecraft -X stuff "stop $(echo -ne '\r')"
para enviar a la pantalla 'minecraft' el texto detenido y un retorno de carro. Pero eso no funciona, incluso si lo escribo directamente en la línea de comando. Pero si 'screen -r' puedo acceder a la pantalla con el servidor en ejecución, escriba 'stop' y se apagará correctamente.
El servidor funciona bien si hago telnet y lo hago manualmente, solo necesito ejecutarlo sin estar conectado desde mi computadora remota.
fuente
screen
no pudo comenzar? Intente agregarset -x
en la parte superior de la secuencia de comandos (justo después de la#!
línea) e informe el resultado del seguimiento cuando ejecute la secuencia de comandos.#!/bin/bash
yset -x
en la parte superior del guión, y muéstrenos el resultado de seguimiento del guión. Es posible que deba buscar en la documentación de unMENU para saber a dónde va esa salida.Respuestas:
Puedo resolver al menos parte del problema: por qué la
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 enviada más tardescreen -X stuff
simplemente se pierde. Debe especificar explícitamente que desea enviar las pulsaciones de teclas a la ventana 0 (-p 0
). De todos modos, esta es una buena idea, en caso de que cree otras ventanas en esa sesión de Pantalla por cualquier motivo.(La pantalla se traduce
^M
a control-M, que es el carácter enviado por la Entertecla).El problema al iniciar la sesión desde un script probablemente esté relacionado con unMENU.
fuente
screen -d -m -S hi
y luego ejecutoscreen -S hi -p 0 -X stuff "cd <some_directory>^M"
y no obtengo nada como resultado ... simplemente envía "cd <some_directory> ^ M" como una cadena y no interpreta "^ M" como la tecla enter ...Primero, una nota sobre cómo ingresar nuevas líneas fácilmente:
Solo un
$()
aviso de que la construcción elimina las nuevas líneas 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, supongo que está tratando específicamente de enviar el equivalente de la Enterpulsación de tecla. Si bien el retorno de carro con el que está enviando\r
no se raya, hay varias formas más fáciles de ingresar ese carácter sin la necesidad de un comando adicional.Puede colocar una nueva línea regular dentro de sus comillas dobles
O puede ingresar el carácter en una línea terminal usando la secuencia Ctrl+ v Enter. Esto se verá algo así como
^M
en la terminal, pero es un personaje especial de nueva línea.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 la entrada a una sesión de pantalla que nunca se ha adjuntado. Si ejecuta esto, habrá fallado:
Pero si ejecuta esto, funcionará:
Por último, podría usar el mejor comportamiento en
tmux
lugar descreen
.GNU-Screen ha sido un multiplexor de terminales de facto durante muchos años, pero ha dejado de desarrollarse y los errores y las peculiaridades no se están solucionando. Tmux está en desarrollo activo, incluye muchas características que la pantalla no puede tocar, y su comportamiento fuera de la caja es bastante más intuitivo. Además, está mejor documentado. Así es como convertirías tu código:
fuente
screen -d -RR minecraft
?.screenrc
o tienes un montón de sesiones de pantalla abiertas con ese nombre y entonces estás enviando datos a la incorrecta?screen -list
?Pido disculpas por desenterrar esta publicación anterior, pero esto me habría ayudado en mis esfuerzos si esta información estuviera 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 la piel de gato, esto se puede hacer, pero me gusta de esta manera. Con esto, puede enviar cualquier comando o decir cualquier cosa simplemente llamando a la función say_this.
Esto es con ssh!
fuente