Crear un demonio de Mac OS X adecuado y seguro es una tarea relativamente difícil. Tenga en cuenta que este documento es un trabajo en progreso.
Contenido
- 1 Introducción
- 2 Palabras de interés sobre sudo
- 3 Lista de tareas
- 4 Creación de un usuario y grupo de demonios de _minecraft
- 4.1 La forma fácil (e incorrecta)
- 4.2 El camino difícil (y correcto)
- 4.2.1 Creación del grupo (GID)
- 4.2.2 Creando el usuario (UID)
- 4.2.3 Creación de la casa de usuario
- 4.2.4 Mover los archivos del servidor
- 5 archivos de soporte
- 5.1 minecraft.command
- 5.1.1 Explicación
- Terminación 5.1.2
- 5.2 start.sh
- 5.3 stop.sh
- 5.3.1 Explicación
- 5.3.2 redirección stdin
- Terminación 5.3.3
- 5.1 minecraft.command
- 6 archivos de soporte: una variante
- 7 Archivo de soporte - Singular
- 8 net.minecraft.server.plist
- 9 Copiar y probar archivos
- 9.1 Secuencias de comandos de Shell
- 9.2 Ejecutar demonio
- 10 Inicio / apagado automático
- 10.1 server_daemon.command
- 10.1.1 Explicación
- 10.1.2 Áreas de mejora
- 10.1 server_daemon.command
- 11 Consideraciones sobre la copia de seguridad
- 11.1 net.minecraft.server.backup.plist
- 11.2 comando de copia de seguridad
- 12 Atarlo
Introducción
Al crear un demonio de inicio de Mac OS X, puede funcionar para algunas personas, pero no para otras. Por lo tanto, se recomienda encarecidamente no crear uno a menos que conozca la Terminal y la Consola, y tenga una buena mente analítica que le dirá cada vez que esté cometiendo errores. Este artículo es más una mano amiga, por lo que si no tiene conocimientos previos sobre Terminal y Consola, este artículo puede no ser muy útil.
Esta página le ayudará a hacer que su servidor de Minecraft funcione de forma segura sin tener que iniciar sesión como usuario. Ha sido probado en Mac OS X Server Snow Leopard y Mac OS X Snow Leopard. Su kilometraje variará en otros lugares, ya que los comandos han cambiado un poco.
Antes incluso de intentar esto, debe ejecutar una instancia de servidor a mano, para asegurarse de que todo funcione. Si puede ejecutar su servidor y realmente conectarse a él desde una computadora remota, puede comenzar a pensar en crear un demonio.
Palabras de interés sobre sudo
Es mejor usar siempre sudo para cada comando necesario como root. Mucha gente cree que sudo su - es la mejor opción. Aunque esto puede ser más fácil, también es mucho más peligroso hacerlo. Olvidar que eres root y hacer algo incómodo te da más oportunidades de destruir tu computadora.
Es mucho más seguro y, por lo tanto, se recomienda encarecidamente moverse primero a la carpeta adecuada y luego realizar la acción para un archivo o carpeta precisa. Esto se debe a que muchas personas que han intentado crearlo sin moverlo a la carpeta adecuada, han presionado por error retorno al ejecutar un comando desagradable y lo han aplicado a toda su computadora. Es preferible que no aprenda a moverlo primero a la carpeta adecuada de la manera difícil.
La última razón por la que es mejor usar sudo es porque cada comando de sudo está registrado en su consola, lo que significa que sabe lo que sucede, y si hizo algo incorrecto, puede revisar su registro y saber qué hizo para intentar repararlo. Hacer un sudo su - solo mostrará eso. Sin embargo, es tu computadora, son tus hábitos, ¡haz lo que quieras con ella!
Lista de quehaceres
- La asignación de puertos no es compatible con esta versión
- El servidor no se cierra correctamente cuando se apaga el sistema. Esto deberá ser investigado
- La copia de seguridad debe tener su usuario, tener una trampa y, de hecho, sugerir un esquema de copia de seguridad, como una copia de seguridad incremental rsync o algo así.
Creación de un usuario y grupo de demonios de _minecraft
Esta sección es técnicamente opcional, pero por razones de seguridad, debe hacerlo, preferiblemente de la "manera dura y correcta".
Es muy importante hacer uno de los siguientes métodos, específicamente de la manera difícil y correcta, ya que si no haces nada, cualquiera que piratee tu computadora a través de Minecraft podrá hacer lo que quiera. Por lo tanto, si no desea que esto suceda, debe hacerlo de la manera correcta y difícil.
La forma fácil (e incorrecta)
- Haga clic en el elemento del menú de Apple
- Abrir preferencias del sistema
- Haga clic en Sistema: Cuentas
- Haga clic en el candado para desbloquear la página.
- Ingrese su contraseña de administrador
- Haga clic en el botón Más
- Cree un nuevo usuario estándar, llamado Minecraft (asegúrese de modificar el archivo plist de launchd que dice que está usando un usuario diferente) con una contraseña
- Haga clic en Aceptar"
Una vez que haya completado estos pasos, ¡habrá terminado! Sin embargo, esto crea un usuario de pleno derecho, mientras que Mac OS X espera un usuario demonio. Como beneficio adicional, puede ejecutar esto como su propio usuario personal o cualquier otra posibilidad para los usuarios. Sin embargo, si su usuario de Minecraft es pirateado, el hacker tendrá una cuenta completa para divertirse, acceder a todo su software y poder modificar todo lo que es público. Por lo tanto, aunque este método puede ser fácil, no es del todo seguro, por lo que se recomienda crear el usuario y grupo de demonios _minecraft de la manera más difícil.
El camino difícil (y correcto)
El usuario se creará primero con un guión bajo, lo que indica que es un demonio y debe estar oculto a la vista del usuario. También se creará con un UID de demonio. Usaremos dscl para crear un usuario y un grupo. Evidentemente, hay que hacerlo con privilegios. Abra Terminal y escriba
MyMac: ~ myuser $ sudo dscl Contraseña: (su contraseña) Ingresando al modo interactivo ... (escriba "ayuda" para los comandos)
Vayamos a la carpeta base para lo que tenemos que hacer (menos tipeo)
> cd / Local / Predeterminado / / Local / Predeterminado>
Si está ejecutando un Mac OS X Server, utilice el Administrador de grupos de trabajo [WGM] suministrado por Apple para crear las carpetas de usuario, grupo y de inicio con un esfuerzo mínimo. Asegúrese de utilizar números de identificación inferiores a 1024 (en este ejemplo se utiliza 300).
Si tiene otra autenticación de directorio, es posible que deba moverse a otra carpeta en lugar de Local. Utilice el comando ls para ver las diferentes carpetas. Para saber si está en el buen lugar, debe tener una carpeta de Usuarios con diferentes nombres con prefijo de subrayado (como _coreaudiod, _softwareupdate y _www).
Creando el grupo (GID)
/ Local / Predeterminado> ls Grupos gid
Esto mostrará una lista de todos los grupos creados en su computadora, junto con sus GID. No importa cuáles sean, solo se necesita un GID vacío, potencialmente en el rango del demonio (menos de 500). Verifique si 300 no está en uso.
/ Local / Predeterminado> crear Grupos / _minecraft / Local / Predeterminado> crear Grupos / _minecraft PrimaryGroupID 300
En este punto, se debe crear su grupo y asignarle el GID 300 (o cualquier número que elija). Puede verificarlo con el comando ls Groups gid y puede compararlo con otros con el comando read Groups / _minecraft.
Creando el usuario (UID)
/ Local / Predeterminado> ls Users uid
Esto mostrará una lista de todos los usuarios creados en su computadora, junto con sus UID. Nuevamente, no importa cuáles sean, pero es necesario un UID vacío, nuevamente en el rango del demonio (menos de 500). Verifique si 300 no está en uso. Puede seleccionar un UID y GID diferentes, no es necesario que sean idénticos, pero ciertamente es más ordenado si lo son.
/ Local / Predeterminado> crear Usuarios / _minecraft UserShell / bin / bash / Local / Predeterminado> crear Usuarios / _minecraft UniqueID 300 / Local / Predeterminado> crear Usuarios / _minecraft PrimaryGroupID 300 / Local / Predeterminado> crear Usuarios / _minecraft NFSHomeDirectory / Users / _minecraft
Esto creó su usuario. Obviamente, debe modificar el UniqueID (UID) para el que eligió en este paso y el PrimaryGroupID para el que eligió en la sección anterior. También puede elegir un directorio de inicio diferente. Puede poner su carpeta de Minecraft con los otros usuarios, pero está bien poner esto en cualquier lugar que desee, de verdad.
Al igual que para el GID, puede usar ls Users uid y leer Users / _minecraft para asegurarse de que todo esté bien.
Ahora, le dijimos al usuario que tenemos un grupo (PrimaryGroupID) pero necesitamos decirle al grupo que tiene usuarios:
/ Local / Predeterminado> agregar grupos / _minecraft GroupMembership _minecraft
¡Y hemos terminado!
/ Local / Predeterminado> salir Adiós
Es posible que desee algo como esto para evitar que el usuario aparezca en el menú desplegable de inicio de sesión:
sudo dscl. eliminar / Usuarios / _minecraft AuthenticationAuthority sudo dscl. crear / Usuarios / _minecraft Contraseña "*"
Creando la casa del usuario
Ahora necesitamos crear la carpeta de inicio. Suponiendo que lo describió anteriormente como / Users / _minecraft, escriba:
MyMac: ~ myuser $ cd / Users MyMac: Usuarios myuser $ sudo mkdir _minecraft MyMac: Usuarios myuser $ sudo chown _minecraft: _minecraft _minecraft o simplemente sudo createhomedir -u _minecraft source: http://support.apple.com/kb/TA21050? viewlocale = en_US MyMac: Usuarios myuser $ ls -la
¡Vaya, hay muchos _minecraft aquí! Aquí hay una versión en la que puedes entender algo (¡no vayas a ejecutar esto, dicho eso!)
cd / Users sudo mkdir UserFolder sudo chown UserName: GroupName UserFolder ls -la
¡Aquí ... mejor! Si estos comandos se ejecutan, significa que su usuario y grupo se crearon correctamente en los pasos anteriores. En este punto, ls -la debería darle algo como
total 0 drwxr-xr-x 5 administrador raíz 170 15 jui 2010. drwxrwxr-x @ 34 root admin 1224 6 ene 23:33 .. -rw-r - r-- 1 root wheel 0 1 de julio de 2009 .localized drwxrwxrwt 5 root wheel 170 30 sep 20:18 Shared drwxr-xr-x + 27 _minecraft _minecraft 0 26 de febrero 12:54 _minecraft drwxr-xr-x + 27 personal de sakamura 918 10 de noviembre 21:48 sakamura
Mover los archivos del servidor
Eso es un paseo por el parque comparado con lo que pasamos. Primero, asegúrese de que su servidor de Minecraft no se esté ejecutando, ¡o definitivamente perderá datos! Luego...
MyMac: ~ myuser $ cd / Users / _minecraft MyMac: _minecraft myuser $ sudo mv ~ / Desktop / Minecraft Server / *. MyMac: _minecraft myuser $ sudo chown -R _minecraft: _minecraft *
Por supuesto, desea ajustar según sea necesario, con la ruta de inicio donde realmente instaló su servidor de Minecraft en primer lugar, y consulte la sección anterior para obtener una explicación del comando chown. Y no olvide el punto al final del comando mv, apenas es visible pero está ahí, ¡significa que el destino es nuestra carpeta actual! De lo contrario, el comando fallará
Consejo n. ° 1: si presiona Tab una vez, completará automáticamente el nombre del archivo / carpeta. Eso es muy útil para escribir rápidamente caracteres especiales como la barra espaciadora malvada que debe escribirse primero con una barra invertida.
Consejo # 2: Si presiona Tab dos veces, le mostrará todas las posibilidades de autocompletar posibles, para darle una opción rápida si olvidó cómo está escrito en realidad.
Consejo para el lector astuto: en lugar de hacer un chown una vez en el paso anterior y un chown en este paso, es más rápido simplemente mover la carpeta y hacer chown -R en la carpeta resultante. Un comando menos. La razón por la que se recomienda hacerlo dos veces es para asegurarse de que su Usuario y Grupo se hayan creado correctamente en el paso anterior. Pero no hay motivo.
Archivos de soporte
Necesita algunos archivos para que esto funcione adecuadamente. Se podría hacer con menos archivos, pero de esa manera es más legible. Cópielos con cuidado y modifique lo que deba modificarse en consecuencia. Una buena opción es usar vim como editor de texto, ya que mantiene los retornos de carro en sus lugares correctos y no trata de ser inteligente conmigo. Sin embargo, también (con emacs) es uno de los editores más difíciles de usar, de otra época. En cuanto a la GUI, Apple TextEdit debería estar bien para esto, siempre que siga las instrucciones de Mac OS X Configuración de una página de servidor (IE: Make as Plain Text). Nota: estos deben crearse en una ubicación temporal, como su escritorio. Las instrucciones para mudarse a la ubicación final se encuentran más abajo.
minecraft.command
#! / bin / bash trap 'echo "$ (fecha) Matando Minecraft."; ./stop.sh; exit 'TERM ipconfig waitall echo "$ (fecha) Iniciando Minecraft". ./start.sh & wait echo "$ (fecha) Minecraft terminado".
Explicación
De regreso a la escuela, estoy aprendiendo mucho.
Rescisión
Mac OS X Launchd envía un SIGTERM (control-co señal 15) para matar un demonio. Java plain regresa cuando recibe uno. Por lo tanto, debe atraparlo antes de que llegue a java. Todo el código stop.sh podría agregarse a la línea de trampa (con muchos; y, pero sería complicado).
El script de inicio debe iniciarse de forma asincrónica y esperar, ya que la trampa debe salir, esperar para ejecutarse correctamente. Consulte los ejemplos de trampa y la explicación aquí.
start.sh
#! / bin / bash touch stdin.commandlist tail -n 0 -f stdin.commandlist | java -Xmx1G -Xms1G -jar servidor_de_minecraft.jar nogui
stop.sh
#! / bin / bash PID = `lsof -i -P | grep ': 25565 (ESCUCHAR)' | awk '{imprimir $ 2}' `if [" $ PID "! =" "]; luego echo "Killing MineCraft Server PID = $ PID" kill -TERM $ PID else echo "MineCraft not running" fi
Explicación
redirección stdin
En los otros sistemas similares a Unix, el comando de pantalla se usa para crear una pantalla TTY separada para ejecutar el sistema java. La principal ventaja es poder cambiar a esa pantalla si alguien quiere interactuar directamente con el servidor. Eso funcionaría si pusiera el plist de launchd en su carpeta de usuario personal, pero no funcionará en el demonio de inicio y, específicamente, no es compatible con launchd, aunque puede obtener una pantalla actualizada que no lo hará. causar problemas.
Hay varias formas de enviar comandos, incluido un mkfifo que funcionará bien, pero causará problemas con los retornos de carro. Por lo tanto, es preferible usar un archivo y agregar los comandos que desea enviar a Java a través de una tubería.
Rescisión
El comando tail terminará automáticamente una vez que Java termine.
Archivos de soporte: una variante
Es posible que lo anterior no funcione para algunas personas por varias razones: el comando tail nunca terminó y launchd no funcionaba correctamente con start.sh y stop.sh ejecutándose en subshells. Además, es mejor tener un apagado limpio en el que se le indique al servidor que guarde todo y se detenga en lugar de simplemente ser eliminado.
#! / bin / bash trap 'echo "$ (fecha) Matando Minecraft."; . ./stop.sh 'HUP INT TERM ipconfig waitall echo "$ (fecha) Iniciando Minecraft." . ./start.sh espera `gato minecraft.pid` echo" $ (fecha) Minecraft terminado ".
En lo anterior, obtenemos start.sh y stop.sh, en lugar de ejecutarlos en subcapas. Sin embargo, necesitamos que Java se ejecute en segundo plano, por lo que start.sh se cambia para hacer eso. También guarda el PID en minecraft.pid. Debido a que la cola no salía, también usé un quince.
#! / bin / bash rm -f comando-fifo mkfifo comando-fifo java -Xmx1G -Xms1G -jar craftbukkit.jar nogui <> comando-fifo & echo $! > | minecraft.pid
Tenga en cuenta que si no utiliza craftbukkit, sino el servidor normal. donde dice "craftbukkit.jar" debería leer "minecraft_server.jar" Finalmente se cambia stop para detener el servidor limpiamente.
#! / bin / bash PID = `gato minecraft.pid` if [" $ PID "! =" "]; luego echo "Deteniendo MineCraft Server PID = $ PID" echo guardar-todo >> comando-FIFO echo detener >> comando-Fifo esperar $ PID rm minecraft.pid echo "Cierre de MineCraft completo". else echo "MineCraft no se está ejecutando" fi
Archivo de soporte - Singular
No es necesario mantener varios archivos de script de shell para iniciar y finalizar Minecraft. El archivo de script único a continuación será suficiente:
#! / usr / bin / env -i bash MinecraftServer () {/ usr / sbin / ipconfig waitall Estado "Iniciando servidor Minecraft ..." servidor id de proceso trampa Evacuar HUP INT TERM MC_SIO = "$ (mktemp -d -t minecraft) / servidor" mkfifo "$ MC_SIO" java -Xms1G -Xmx1G -jar minecraft_server.1.8.1.jar nogui <> "$ MC_SIO" & MC_PID = $! Estado "Minecraft PID: $ {MC_PID}" espera rm -rf "$ (dirname $ MC_SIO)" Estado "El servidor se ha cerrado". } Evacuate () {Estado "Deteniendo Minecraft ..." echo "detener" >> "$ MC_SIO" espera $ MC_PID Estado "Minecraft se ha detenido". } Status () {# Registra mensajes en syslog para que sean visibles en Console.app logger -t Minecraft "$ @"} MinecraftServer
net.minecraft.server.plist
Etiqueta net.minecraft.server ProgramaArgumentos ./minecraft.command RunAtLoad Directorio de trabajo / Usuarios / _minecraft Nombre de usuario _Minecraft
Modifique su nombre de usuario en consecuencia o elimine esa sección por completo si desea ejecutarla como root. También debe modificar su WorkingDirectory para que apunte a la ruta correcta. La etiqueta es lo que se mostrará en la herramienta Consola.
Copiar y probar archivos
Guiones de shell
Una vez que haya creado sus archivos en su escritorio, puede copiarlos:
MyMac: ~ myuser $ cd / Users / _minecraft MyMac: _minecraft myuser $ sudo cp ~ / Desktop / minecraft.command ~ / Desktop / start.sh ~ / Desktop / stop.sh. MyMac: _minecraft myuser $ sudo chmod 755 minecraft.command start.sh stop.sh MyMac: _minecraft myuser $ sudo chown _minecraft: _minecraft minecraft.command start.sh stop.sh
Nuevamente, no olvide el punto al final del comando cp.
Puede intentar ejecutarlos (ya que está en la carpeta buena, funcionará):
MyMac: _minecraft myuser $ sudo -u _minecraft ./minecraft.command
El comando en sí nunca debería regresar, está bien, pero el servidor debería iniciarse correctamente sin ningún mensaje de error, y debería ver que se inicia el entorno Java. Puede hacer control-c para terminar el servidor. Aunque parece atractivo, realmente no puede ejecutar ningún comando desde esa consola, ya que stdin fue redirigido desde un archivo, pero si lo desea, puede iniciar una segunda terminal y emitir comandos como sudo echo save-all >> / Users / _minecraft / stdin.commandlist y deberían ejecutarse.
Ejecutar demonio
Necesitamos decirle a Mac OS X que deseamos iniciar el demonio con la computadora cuando se inicie, antes de que llegue a la pantalla de inicio de sesión. Eso es una mera copia de ese punto:
MyMac: ~ myuser $ cd / Library / LaunchDaemons MyMac: LaunchDaemons myuser $ sudo cp ~ / Desktop / net.minecraft.server.plist. MyMac: LaunchDaemons myuser $ sudo chmod 755 net.minecraft.server.plist MyMac: LaunchDaemons myuser $ sudo chown root: rueda net.minecraft.server.plist
En este punto, cuando reinicie su computadora, ¡debería iniciar automáticamente su servidor! Puedes probarlo inmediatamente usando la siguiente línea:
MyMac: LaunchDaemons myuser $ sudo launchctl load net.minecraft.server.plist
Eso debería cargar su servidor de Minecraft en su usuario adecuado. Debe verificar que esté allí y sin errores yendo a la Consola y mirando el Registro del sistema. También debe verificar en la herramienta Activity Monitor que el proceso se inició y se está ejecutando bajo el usuario _minecraft. Obviamente, intentar ejecutar un juego de Minecraft puede ser algo agradable.
En cualquier momento, puede descargar el servidor (pero recuerde que se iniciará automáticamente cuando reinicie su computadora, a menos que retire el archivo:
MyMac: LaunchDaemons myuser $ sudo launchctl unload net.minecraft.server.plist
Inicio / apagado automático
Es posible que desee no tener su servidor funcionando todo el tiempo si nadie está conectado a él. Esto se puede lograr con solo un script más :)
Antes de configurar esto, haga funcionar el método 'Varient' anterior, ya que funcionará mejor con él.
server_daemon.command
En lugar de configurar el archivo launchd net.minecraft.server.plist para que ejecute minecraft_server.command, configúrelo para que ejecute server_daemon.command, después de colocarlo en el directorio del servidor.
#! / bin / bash # bucle principal while: do # escuchar conexiones ipconfig waitall nc -l 25565 | grep -a -o -E "b (w +) $"> user.txt MATCHES = $ (grep -f user.txt whitelist.json | wc -l | tr -d '') rm user.txt # si no, escuche las conexiones si [$ MATCHES -eq 0], luego continúe fi # iniciar el script de control del servidor ./minecraft_server.command & commandPID = $! # comprobar periódicamente la actividad mientras: dormir 15 conexiones = $ (lsof | grep 25565 | grep -v -e LISTEN | wc -l | tr -d "") # si no se detecta ninguna, terminar el script de control y escuchar las conexiones si [$ connections -eq 0] luego kill -TERM $ commandPID wait $ commandPID break fi done done
Explicación
Este script escucha la actividad en el puerto predeterminado de Minecraft, 25565 y ejecuta el servidor cuando se establece una conexión. Debido a que los clientes de Minecraft envían el nombre de usuario en el primer contacto, este script lo usa para verificar si el jugador tiene acceso al servidor y lo ignora si no lo tiene. Esto podría cambiarse para permitir que cualquier persona inicie el servidor de forma remota eliminando la declaración 'if'. Tenga en cuenta que los usuarios deben conectarse dos veces en una ejecución en frío: una vez para iniciar el servidor y nuevamente una vez que esté en funcionamiento.
A continuación, el script simplemente comprueba periódicamente si hay alguna conexión activa en el puerto de Minecraft y, de lo contrario, espera a que el servidor se apague antes de volver a escuchar si hay más conexiones.
Áreas para mejorar
Este script crea una gran cantidad de archivos temporales en el directorio del servidor, ¿tal vez podrían colocarse en / tmp o en un subdirectorio temporal?
Esta secuencia de comandos no utiliza variables de entorno para personalizar configuraciones como el número de puerto y el intervalo de tiempo de espera.
Consideraciones de respaldo
Es bastante fácil iniciar copias de seguridad periódicas. Por extensión, agregar un launchd.plist de respaldo y un archivo de comando es casi una obviedad. El siguiente código se ejecutará cada hora, solo cuando Minecraft se esté ejecutando, detendrá el guardado, esperará a que la consola muestre que se realizó el guardado y lo iniciará de nuevo una vez que haya terminado de realizar la copia de seguridad.
Consejo # 1: agregue su propio código de respaldo en el comentario, o de lo contrario, no hará nada :)
Consejo # 2: este código se ejecuta como root. Puede hacer que se ejecute como otro usuario si lo desea, como crear un segundo usuario en el mismo grupo _minecraft, lo que significa que el sistema de respaldo podrá leer los archivos pero no modificarlos. ¡Eso queda para el lector!
Consejo n. ° 3: este código puede recibir una solicitud de apagado, por lo que realmente debería haber un comando de captura o, de lo contrario, podría interrumpirse mientras se realiza la copia de seguridad.
net.minecraft.server.backup.plist
Etiqueta net.minecraft.server.backup ProgramaArgumentos ./backup.command RunAtLoad StartInterval 1.0 Directorio de trabajo / Usuarios / _minecraft
backup.command
#! / bin / bash ps -u _minecraft> / dev / null 2> / dev / null if [$? ! = 0]; luego echo $ (date) Minecraft off: no se puede hacer una copia de seguridad. exit fi echo save-off >> stdin.commandlist echo save-all >> stdin.commandlist tail -n 3 -f /var/log/system.log | while read line hacer if echo $ line | grep -q 'CONSOLA: Guardar completo.'; luego # agregue sus comandos de respaldo aquí, como svn o rsync echo save-on >> stdin.commandlist exit 0 fi done
Tutoriales | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Introductorio |
| ||||||||||||
General |
| ||||||||||||
Desafíos |
| ||||||||||||
Construcciones |
| ||||||||||||
Sostenible |
| ||||||||||||
Encantador y fundición |
| ||||||||||||
Rompiendo bloques |
| ||||||||||||
Mecanismos |
| ||||||||||||
Servidores |
| ||||||||||||
Apoyo técnico |
| ||||||||||||
Anticuado |
|
Este artículo es bastante impreciso, así que ayude a limpiar este artículo, o si sabe mucho sobre este tema, agregue información o aclare la información existente.