You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Raspbian中以服务运行TCP/IP监听Jar时遇连接拒绝问题

排查Raspbian下Java TCP服务连接被拒绝的问题

我来帮你一步步定位这个问题,毕竟在树莓派上跑Java服务踩过不少类似的坑😉

第一步:先修复你的不完整Shell脚本

你贴的脚本明显截断了(最后是>> /de...),这大概率是启动失败的原因之一。先把脚本补全并优化,确保服务能稳定后台运行:

#!/bin/sh
SERVICE_NAME=Tourmaline
PATH_TO_JAR=/usr/local/bin/Tourmaline.jar
PID_PATH_NAME=/tmp/Tourmaline-pid
LOG_PATH=/var/log/tourmaline.log  # 新增日志文件,方便排查启动报错

# 给日志文件赋权(避免启动时权限不足)
sudo touch $LOG_PATH && sudo chown $USER:$USER $LOG_PATH

case $1 in
    start)
        echo "Starting $SERVICE_NAME ..."
        if [ ! -f $PID_PATH_NAME ]; then
            # 用nohup让服务后台运行,避免脚本退出后服务终止
            nohup java -jar $PATH_TO_JAR > $LOG_PATH 2>&1 &
            echo $! > $PID_PATH_NAME
            echo "$SERVICE_NAME started successfully with PID $(cat $PID_PATH_NAME)"
        else
            echo "$SERVICE_NAME is already running, PID $(cat $PID_PATH_NAME)"
        fi
        ;;
    stop)
        if [ -f $PID_PATH_NAME ]; then
            PID=$(cat $PID_PATH_NAME)
            echo "Stopping $SERVICE_NAME (PID $PID) ..."
            kill $PID
            rm $PID_PATH_NAME
            echo "$SERVICE_NAME stopped successfully"
        else
            echo "$SERVICE_NAME is not running"
        fi
        ;;
    status)
        if [ -f $PID_PATH_NAME ]; then
            PID=$(cat $PID_PATH_NAME)
            if ps -p $PID > /dev/null; then
                echo "$SERVICE_NAME is running, PID $PID"
            else
                echo "$SERVICE_NAME is not running but PID file exists"
                rm $PID_PATH_NAME
            fi
        else
            echo "$SERVICE_NAME is not running"
        fi
        ;;
    *)
        echo "Usage: $0 {start|stop|status}"
        exit 1
        ;;
esac

优化点说明:

  • 替换exec为nohup,确保服务能脱离终端后台运行
  • 新增日志文件,解决原脚本日志输出不完整的问题
  • 补全stop/status分支,方便管理服务状态
  • 提前处理日志文件权限,避免启动失败

第二步:确保脚本可执行并启动服务

  1. 给脚本添加执行权限:
    sudo chmod +x /usr/local/bin/Tourmaline.sh
    
  2. 启动服务:
    sudo /usr/local/bin/Tourmaline.sh start
    
  3. 检查服务状态:
    sudo /usr/local/bin/Tourmaline.sh status
    
    • 如果显示未运行,直接查看日志找报错:cat /var/log/tourmaline.log(大概率是Java版本不兼容、Jar依赖缺失或代码启动失败)
    • 如果显示运行,继续下一步排查

第三步:检查服务是否正确监听端口

假设你的TCP服务应该监听某个端口(比如8080),用以下命令确认:

sudo ss -tulpn | grep java
  • 如果看不到服务监听的端口,说明Jar本身没有启动监听(比如代码里端口配置错误、绑定了127.0.0.1导致外部无法访问)
  • 如果看到监听地址是127.0.0.1:xxxx,需要修改Jar内的配置,让它绑定0.0.0.0:xxxx,这样外部设备才能连接

第四步:排查Raspbian防火墙限制

Raspbian默认使用ufw防火墙,先检查是否开启:

sudo ufw status

如果防火墙处于开启状态,需要允许服务对应的TCP端口:

sudo ufw allow 8080/tcp  # 替换8080为你的服务端口
sudo ufw reload

第五步:本地测试连接,缩小问题范围

先在树莓派本地测试是否能连接,排除网络问题:

nc -zv localhost 8080  # 替换8080为你的服务端口
  • 如果本地能连接但外部不行:大概率是路由器端口映射未配置,或树莓派的局域网IP访问受限
  • 如果本地也连接失败:回到第二步查看日志,确认服务是否真的正常启动

内容的提问来源于stack exchange,提问作者user7925257

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:12:14