Joc*_*ers 2 shell networking packet
当有人尝试在端口 25565 上连接到我的我的世界服务器时,我想启动它。我有一个服务器插件,它在没有玩家在线的情况下在 x 分钟后关闭它。使用 shell 脚本,我创建了一个循环,在服务器关闭时启动它:
#!/bin/bash
while true
do
# run server
java -Xms2048M -Xmx2048M -Djava.awt.headless=true -jar "craftbukkit.jar"
# server shut down
# run MCSignOnDoor
java -jar MCSignOnDoor.jar --sentrymode -m "Gone Fishin' Back in Five Minutes!"
# McSignOnDoor shut down
# stop loop if error code is not 12
# so only restart the server when the program ended because of a packet
if [ "$?" -ne "12" ]; then
break
fi
done
Run Code Online (Sandbox Code Playgroud)
McSignOnDoor 是一个 Java 程序,它模拟了一个活动服务器,一旦有人用退出代码 12 在端口 25565 上 ping 它就会退出。遗憾的是,这在协议更新后不起作用,所以我正在寻找替代方案。
有没有办法等到它在端口 25565(或任何其他端口)上收到数据包,然后继续执行脚本?
Linux 中已经包含一项提供此功能的服务,称为xinetd
. Red Hat 在他们的网站上维护了相当不错的文档,标题为:2.6.4。xinetd 配置文件。该服务xinetd
允许您设置一个主服务,该服务将侦听特定端口,然后在所述端口上建立连接时启动其他应用程序。
摘自 xinetd 手册页
xinetd 执行与 inetd 相同的功能:它启动提供 Internet 服务的程序。xinetd 不是在系统初始化时启动这些服务器,并在连接请求到达之前一直处于休眠状态,而是唯一启动的守护进程,它侦听其配置文件中列出的服务的所有服务端口。当一个请求进来时,xinetd 启动相应的服务器。由于其运行方式,xinetd(以及 inetd)也被称为超级服务器。
注意:如果未安装,您可以安装它,该软件包通常称为xinetd
.
安装后,您将配置文件放在此目录下,/etc/xinetd.d
. 例如,让我们创建一个名为 的服务minecraft
。
# /etc/xinetd.d/minecraft
service minecraft
{
disable = no
type = UNLISTED
socket_type = stream
protocol = tcp
wait = no
server = /path/to/minecraft/server
bind = <ip of minecraft server>
port = 25565
user = root
}
Run Code Online (Sandbox Code Playgroud)
有了上面的文件,你就可以手动开始xinetd
检查了。
$ sudo service xinetd start
Run Code Online (Sandbox Code Playgroud)
现在,当您尝试通过端口 25565 连接到您的系统时,minecraft 服务器应该会启动并且您应该能够访问它。您可能需要将user = ..
线路调整为最终拥有服务器的任何用户。
为了使其持久化,您可以使用发行版在启动期间自动启动服务的任何机制。