如果屏幕会话没有正在运行的进程,我该如何终止它?

如果屏幕会话没有正在运行的进程,我该如何终止它?

我曾经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,然后跳出循环。由于循环已中断,因此可以安全地关闭屏幕会话

相关内容