因此,我在 Ubuntu VM 上托管了多个 Minecraft 服务器,并设置了一个脚本来同时启动所有服务器。这些服务器在屏幕会话中运行,脚本所做的基本上是将 java start 命令发送到这些屏幕会话,如果找不到屏幕会话,则创建一个。问题是屏幕会话默认为您当前的工作目录,而我定位的 jar 都在不同的目录中(即不是我当前的目录)因此,例如在重新启动后,当所有屏幕会话都处于离线状态并需要启动时,它们不会在正确的目录中启动。因此,我需要的是创建这些新的屏幕会话以在特定目录中启动,或者以不同目录中的 jar 为目标并设置它们的工作目录。我一直在尝试寻找解决方案,但一无所获。以下是我的脚本:
这只是我用来启动服务器的脚本之一,其他脚本基本相同,只是启动标志不同。我删除了内存标志,因为它们不相关(据我所知),只是让代码块变得很长。:
#!/bin/bash
if
screen -S "SMP" -X stuff 'java [Lots of fine-tuned java memory flags] -jar paper.jar nogui^M'
then
echo "Server starting on prexisting screen"
else
echo "Cannot find prexsisting screen, attempting to create a new one."
screen -dmS "SMP"
screen -S "SMP" -X stuff 'java [Lots of fine-tuned java memory flags] -jar paper.jar nogui^M'
echo "Loaded server on a new screen"
fi
下面是我调用上述脚本的脚本。我将所有启动脚本都写在各自的 .sh 文件中,然后从一个文件中调用它们(这是我实际用来启动服务器的脚本):
#!/bin/bash
echo "Attempting to start all servers"
bash /opt/opt/new_lobby/start.sh
bash /opt/opt/new_SMP/start.sh
bash /opt/opt/new_creative/start.sh
bash /opt/opt/network/start.sh
echo "All server start files have attempted to be executed"
如果有人对此有任何想法,请帮忙。另外,我知道这不是“Ubuntu 特有的”,但它是 Bash 脚本,我真的不知道还能把它放在哪里,因为它是 Java、Bash 和 Minecraft 的结合体。PS 我知道我的脚本中有拼写错误,但这是我第一次将它们复制/粘贴到具有自动更正功能的东西中,我还没有更改它们哈哈。
答案1
有两种方法可以做到这一点:
- 使用完全限定路径执行 (
java ... /path/to/file.jar
) cd
在你的脚本中使用。
第一个是不言自明的——在执行时使用文件的完整路径。
第二个是每个执行行都需要的,以便不同的目录在cd /the/dir/to/enter
执行操作之前进行调用。cd
不是影响脚本外部的 shell,它会在生成的 shell 中执行为了cd
该脚本,和你直接在命令行运行的效果是一样的。