如何在指定端口存在入站流量时自动启动脚本?
针对你的需求——电脑处于唤醒状态时,监测指定端口的入站流量并自动启动MC服务器脚本,同时不影响路由器的WOL唤醒功能,我整理了几个实用的方案,你可以根据自己的操作系统选择:
方案一:Linux/macOS 用 xinetd 实现(最简洁稳定)
xinetd 是 Linux 系统里专门用来监听端口、有连接请求时自动启动指定程序的服务,完全符合你的需求,而且配置简单:
安装 xinetd
如果你用 Debian/Ubuntu:sudo apt-get install xinetd如果你用 CentOS/RHEL:
sudo yum install xinetd创建监听配置文件
在/etc/xinetd.d/目录下新建一个配置文件,比如mc-server-trigger:service mc-trigger { disable = no socket_type = stream protocol = tcp port = 25565 # 替换成你的MC服务器端口 wait = no user = your_username # 替换成你的系统用户名 server = /home/your_username/scripts/start-mc.sh # 替换成你的启动脚本路径 only_from = 0.0.0.0/0 # 允许所有IP访问,也可以指定特定IP段 flags = REUSE }编写启动脚本(避免重复启动)
一定要在启动脚本里加个进程判断,防止同一端口有多次连接时重复启动服务器。比如start-mc.sh:#!/bin/bash # 检查MC服务器进程是否已运行(假设用java启动) if ! pgrep -x "java" > /dev/null; then cd /path/to/your/mc-server-folder java -Xmx2G -Xms2G -jar server.jar nogui & fi给脚本加执行权限:
chmod +x /home/your_username/scripts/start-mc.sh重启 xinetd 生效
sudo systemctl restart xinetd这个方案和WOL完全不冲突:电脑关机时xinetd不运行,路由器的WOL唤醒包正常工作;电脑开机后xinetd自动启动监听端口,有连接就触发脚本。
方案二:Windows 用 PowerShell 监听 + NSSM 做成服务
如果是Windows系统,可以用PowerShell写一个简单的端口监听脚本,再用NSSM把它做成开机自启的服务:
编写PowerShell监听脚本
新建一个Start-McOnConnection.ps1文件,内容如下:$targetPort = 25565 # 替换成你的MC端口 $mcServerPath = "C:\path\to\your\mc-server" # MC服务器目录 $startCommand = "java.exe" $startArgs = "-Xmx2G -Xms2G -jar server.jar nogui" # 启动TCP监听器 $listener = New-Object System.Net.Sockets.TcpListener([System.Net.IPAddress]::Any, $targetPort) $listener.Start() Write-Host "Listening for connections on port $targetPort..." while ($true) { # 等待入站连接 $client = $listener.AcceptTcpClient() $client.Close() # 不需要处理连接,只要检测到就触发 # 检查MC服务器是否已运行 if (-not (Get-Process -Name "java" -ErrorAction SilentlyContinue)) { Write-Host "Starting MC server..." Start-Process -FilePath $startCommand -ArgumentList $startArgs -WorkingDirectory $mcServerPath } # 加个延迟,避免短时间内多次触发 Start-Sleep -Seconds 30 } $listener.Stop()用NSSM把脚本做成Windows服务
- 下载NSSM(一个轻量的服务管理工具),解压后把它的路径加到系统环境变量里
- 打开命令提示符(管理员权限),执行:
nssm install MCServerTrigger - 在弹出的窗口里:
- Path 选择
powershell.exe - Arguments 填
-ExecutionPolicy Bypass -File "C:\path\to\Start-McOnConnection.ps1" - 切换到Log On标签,选择本地系统账户(或者你的用户账户)
- 点击Install service完成安装
- Path 选择
- 启动服务:
nssm start MCServerTrigger
同样,这个服务只有电脑开机时才运行,不会干扰路由器的WOL唤醒功能。
方案三:用 tcpdump 后台监听(通用但稍复杂)
如果不想用专门的服务,也可以用tcpdump(Linux/macOS)或者Windows的tcpdump替代工具(比如WinDump)来监听端口流量,触发脚本:
以Linux为例,写一个后台运行的脚本:
#!/bin/bash PORT=25565 LOG_FILE=/var/log/mc-trigger.log while true; do # 监听指定端口的TCP SYN包(连接请求) tcpdump -i any -n tcp port $PORT and 'tcp[tcpflags] & tcp-syn != 0' -c 1 >> $LOG_FILE 2>&1 # 检查服务器是否运行 if ! pgrep -x "java" > /dev/null; then cd /path/to/mc-server java -Xmx2G -Xms2G -jar server.jar nogui & echo "Server started at $(date)" >> $LOG_FILE fi # 避免频繁触发 sleep 60 done
把这个脚本加入开机自启(比如用crontab -e加@reboot /path/to/script.sh &),就能后台持续监听。
关于你提到的webserver方案
这个思路其实没必要,因为MC的连接是TCP协议而非HTTP,用webserver监听MC端口的话,需要额外处理非HTTP的连接请求,反而不如直接监听TCP连接的方案简单可靠,所以不推荐。
所有方案都和你的WOL设置不冲突:WOL是电脑关机时路由器发送唤醒包,而这些监听程序只有电脑开机后才会运行,两者完全独立,不会互相干扰。
备注:内容来源于stack exchange,提问作者Exo01

