我曾经screen
运行过一个 Minecraft 服务器,并且每天都会重启它。这是我的启动代码:
screen -mdS mcserver
screen -S mcserver -p 0 -X stuff "java -Xmx4G -jar server.jar^M"
这是我的停止代码:
screen -S mcserver -p 0 -X stuff "stop^M"
sleep 10
screen -XS mcserver quit
发送命令stop
会让 Minecraft 服务器保存世界,这可能需要几秒钟。有没有办法让程序等到java
(Minecraft 服务器)停止运行然后再终止screen
?如果我screen
在发送stop
到 Minecraft 之前终止,世界可能会出现一些故障。(玩家物品与世界方块不同步,人们丢失物品,并意外复制东西)
答案1
对我来说这似乎是可以编写脚本的。你可以尝试做类似这样的简单操作
#!/bin/bash
#Stop the minecraft server
screen -S mcserver -p 0 -X stuff "stop^M"
while true
do
echo "checking for java..."
sleep 2
ps aux |grep 'server.jar' |grep -v grep
[ $? -eq 1 ] && break
done
screen -XS mcserver quit
这基本上会循环,直到在进程列表中找不到 server.jar,然后跳出循环。由于循环已中断,因此可以安全地关闭屏幕会话