【问题标题】:docker: using screen to shut down minecraft server via cron job does not workdocker:使用屏幕通过 cron 作业关闭我的世​​界服务器不起作用
【发布时间】:2018-12-22 16:12:43
【问题描述】:

我想将 docker 用于我的世界服务器。问题是我需要正确关闭它以每 24 小时拯救世界。让事情变得更复杂:服务器上的人需要被告知这一点。

所以我的想法是将“screen”与“cron”结合使用:

################################
### We use a java base image ###
################################
FROM openjdk:8 AS build

MAINTAINER me <me@me.com>

#################
### Arguments ###
#################
ARG PAPERSPIGOT_CI_URL=https://papermc.io/ci/job/Paper-1.13/lastSuccessfulBuild/artifact/paperclip.jar

##########################
### Download paperclip ###
##########################
ADD ${PAPERSPIGOT_CI_URL} /opt/minecraft/server/paperclip.jar

############################################
### Run paperclip and obtain patched jar ###
############################################
RUN cd /opt/minecraft/server/ \
    && java -jar paperclip.jar; exit 0

RUN cd /opt/minecraft/server/ \
    && mv cache/patched*.jar paperspigot.jar

###########################
### Running environment ###
###########################
FROM anapsix/alpine-java:latest

###########################
### Install screen      ###
###########################
RUN apk --update add screen

#########################
### Working directory ###
#########################
WORKDIR /data

###########################################
### Obtain runable jar from build stage ###
###########################################
COPY --from=build /opt/minecraft/server/paperspigot.jar /opt/minecraft/server/paperspigot.jar

########################
### Obtain starth.sh ###
########################
ADD start.sh /opt/minecraft/server/start.sh

########################
### Obtain restart.sh ###
########################
ADD restart.sh /opt/minecraft/server/restart.sh

###########################################
### Configure and run cron              ###
###########################################
COPY crontab /etc/cron/crontab
# Init cron
RUN crontab /etc/cron/crontab

CMD ["crond", "-f"]

###############
### Volumes ###
###############
VOLUME "/data"

#############################
### Expose minecraft port ###
#############################
EXPOSE 25565

######################################
### Entrypoint is the start script ###
######################################
WORKDIR /data
ENTRYPOINT sh /opt/minecraft/server/start.sh

这是似乎可以工作的 start.sh 脚本:

#/bin/sh
cd /data
/usr/bin/screen -S minecraft /opt/jdk1.8.0_192/jre/bin/java -jar -Xms800M -Xmx800M -Dcom.mojang.eula.agree=true /opt/minecraft/server/paperspigot.jar
screen -ls

这是通过 crontab 触发的重启脚本。我认为它永远不会开始:

#!/bin/sh
# me - V1.1 - 18.05.2018
# Minecraft Server restart
screen -Rd minecraft -X stuff "say Server is restarting in 30 seconds! $(printf '\r')"
sleep 23s
screen -Rd minecraft -X stuff "say Server is restarting in 7 seconds! $(printf '\r')"
sleep 1s
screen -Rd minecraft -X stuff "say Server is restarting in 6 seconds! $(printf '\r')"
sleep 1s
screen -Rd minecraft -X stuff "say Server is restarting in 5 seconds! $(printf '\r')"
sleep 1s
screen -Rd minecraft -X stuff "say Server is restarting in 4 seconds! $(printf '\r')"
sleep 1s
screen -Rd minecraft -X stuff "say Server is restarting in 3 seconds! $(printf '\r')"
sleep 1s
screen -Rd minecraft -X stuff "say Server is restarting in 2 seconds! $(printf '\r')"
sleep 1s
screen -Rd minecraft -X stuff "say Server is restarting in 1 second! $(printf '\r')"
sleep 1s
screen -Rd minecraft -X stuff "say Closing server...$(printf '\r')"
screen -Rd minecraft -X stuff "stop $(printf '\r')"
sleep 15s
# echo "Updating to most recent paperclip version."
# wget -q https://papermc.io/ci/job/Paper-1.13/lastSuccessfulBuild/artifact/paperclip.jar -O /home/pi/minecraft/paperclip.jar
echo "Restarting now."
/opt/minecraft/server/start.sh

这是应该每 5 分钟启动一次 restart.sh 的 crontab。不会发生:

*/5 * * * * /opt/minecraft/server/restart.sh

也许这是错误的做法。也许有更好的方法可以以某种方式连接到屏幕会话或以某种方式通过消息重新启动服务器。但是我没有在网上找到任何东西。有什么想法吗?

【问题讨论】:

  • 您的脚本是否有任何原因正在处理服务器公告。内部服务器代码不是更好吗?检查你的电脑时间是否接近12:00,如果是,则警告服务器中的玩家。

标签: docker cron minecraft


【解决方案1】:

经过一些测试和阅读后,我得出结论,在容器内使用 cron 是错误的。

我使用 docker 启动并重新启动 docker 容器。由于它是如此之快,我不需要通知服务器上的 ppl。并且服务器会正​​确停止。

【讨论】:

    【解决方案2】:

    这里有两个可能的问题:

    1. cron 守护进程可能未安装在您的 Docker 映像中,并且
    2. cron 作业可能无法在 Docker 容器中定位可执行文件

    关于第一个,我在您的 Dockerfile 中没有看到任何安装 cron 的内容。您可能想检查您正在使用的基本映像 - 我知道我必须将它安装在我不久前构建的 Ubuntu 映像上。

    至于第二个问题,在你的 crontab 中运行作业的问题是环境不是你期望的那样。具体来说,$PATH 变量(shell 用来查找您要执行的命令)没有设置。结果,许多命令根本不起作用,因为 shell 不知道在哪里找到它们。

    解决此问题的“快速而肮脏”的方法是确保在您的 crontab 中设置了 $PATH 变量,方法是添加以下行:

    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    

    更多详情请见this answer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 2015-02-23
      相关资源
      最近更新 更多