在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分支,方便管理服务状态 - 提前处理日志文件权限,避免启动失败
第二步:确保脚本可执行并启动服务
- 给脚本添加执行权限:
sudo chmod +x /usr/local/bin/Tourmaline.sh - 启动服务:
sudo /usr/local/bin/Tourmaline.sh start - 检查服务状态:
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
相关产品推荐
相关产品推荐

