首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >docker:通过cron作业使用屏幕关闭“我的世界”服务器不起作用

docker:通过cron作业使用屏幕关闭“我的世界”服务器不起作用
EN

Stack Overflow用户
提问于 2018-12-18 22:46:18
回答 2查看 601关注 0票数 0

我想用对接器做我的服务器。问题是,我需要每24小时关闭一次,以拯救世界。让事情变得更复杂:服务器上的人需要被告知这一点。

所以我的想法是把“屏幕”和“cron”结合起来:

代码语言:javascript
运行
复制
################################
### 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脚本:

代码语言:javascript
运行
复制
#/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触发的重新启动脚本。我认为它永远不会开始:

代码语言:javascript
运行
复制
#!/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

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

代码语言:javascript
运行
复制
*/5 * * * * /opt/minecraft/server/restart.sh

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-22 08:12:43

经过一些测试和阅读,我得出结论,在容器中使用cron是错误的,为什么要这样做。

我用码头启动并重新启动码头容器。因为它是如此之快,我不需要通知服务器上的ppl。服务器就会被正确地停止。

票数 1
EN

Stack Overflow用户

发布于 2018-12-18 23:14:11

这里有两个可能的问题:

  1. cron守护进程可能不会安装在您的Docker映像中,并且
  2. cron作业可能在您的Docker容器中查找可执行文件时遇到问题。

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

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

解决这个问题的“快速和脏”方法是通过添加以下行确保在crontab中设置了$PATH变量:

代码语言:javascript
运行
复制
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

有关更多详细信息,请参阅this answer

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53842226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档