Shell 脚本等待来自某个端口的数据包

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(或任何其他端口)上收到数据包,然后继续执行脚本?

slm*_*slm 5

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 = ..线路调整为最终拥有服务器的任何用户。

为了使其持久化,您可以使用发行版在启动期间自动启动服务的任何机制。

参考