后端运维:网络联通、进程查询、Java服务启动脚本
一、前言
后端开发、测试、运维日常工作中,网络连通性排查、服务进程状态查询、Java Jar服务启停脚本是最高频、最基础也最重要的三项技能。绝大多数服务部署失败、接口不通、服务假死问题,都可以通过这套基础链路快速定位。
一、网络连通性排查:Ping 与 Telnet(核心分层排查逻辑)
1.1 核心原理:二者层级完全不同
很多开发者长期存在误区:ping 通 = 服务可用。实际二者工作协议、网络层级、检测目标完全独立,是互补的排查手段:
-
Ping :基于 ICMP 网络层协议(三层) ,只检测「主机是否存活、网络路由是否通畅」,不检测端口、不检测服务
-
Telnet/Curl端口探测 :基于 TCP 传输层协议(四层),检测「IP+端口是否可建立TCP连接、端口是否监听、防火墙是否放行」
核心铁律:ping通 ≠ 端口通;端口通 ≠ 业务正常
1.2 Ping 命令详解(参数+场景+坑点)
1.2.1 基础语法
bash
ping [参数] 目标IP/域名
1.2.2 常用核心参数
| 参数 | 作用 |
|---|---|
| -c 指定次数 | 限定ping探测次数,避免无限ping(Linux必用) |
| -W 超时时间 | 设置单次探测超时时间,单位秒 |
| -i 间隔时间 | 设置两次探测间隔,默认1秒 |
1.2.3 实操示例
bash
# 探测4次后自动停止
ping -c 4 120.79.xxx.xxx
# 探测4次,超时2秒,间隔1秒
ping -c 4 -W 2 -i 1 120.79.xxx.xxx
1.2.4 致命缺陷与生产坑点
-
云服务器、企业防火墙默认禁用ICMP协议 ,普遍出现 ping不通,但业务端口完全正常
-
仅能判断主机网络可达,无法检测服务是否启动、端口是否开放、防火墙是否拦截业务端口
-
ping延迟低、无丢包,不代表TCP端口、HTTP服务可用
1.3 Telnet 端口探测(生产核心排查命令)
由于ICMP协议常被禁用,Telnet端口探测是生产环境验证网络连通的核心手段,用于精准校验四层TCP连通性。
1.3.1 基础语法
bash
telnet 目标IP 目标端口
1.3.2 结果状态精准解读
-
Connected / 黑屏停留:TCP三次握手成功,端口监听正常、防火墙放行、路由通畅
-
Connection refused:端口无进程监听,服务未启动、端口配置错误
-
Connection timed out:防火墙/安全组拦截端口、路由不通、主机未开机
1.3.3 退出方式
连接成功后,按下 Ctrl + ],输入 quit 回车即可退出会话。
1.4 现代替代方案:Curl 端口探测(推荐)
主流Linux系统默认不再预装Telnet,可使用系统自带curl实现同等端口探测,无需安装依赖,兼容性更强。
bash
# 语法:curl -v telnet://IP:端口
curl -v telnet://120.79.xxx.xxx:8888
出现 Established connection 即代表端口通畅、TCP连接建立成功。
1.5 生产标准排查顺序
-
ping 目标IP,快速判断三层网络是否通畅;ping不通直接跳过,属于ICMP拦截
-
使用 curl/telnet 探测业务端口,校验四层TCP连通性
-
端口通畅后,进一步校验HTTP接口、服务日志,确认业务可用
二、Linux 进程查询全套命令(精准排查Java服务状态)
网络通不代表服务正常,端口通不代表业务就绪。进程查询是验证服务是否真正启动的核心手段,开发者必须熟练掌握 ps 全套命令、参数含义、过滤规则。
2.1 核心命令:ps -ef 详解
2.1.1 命令参数释义
bash
ps -ef
-
ps:process status,查看系统进程快照
-
-e:every,展示系统所有用户的全部进程
-
-f:full,展示完整格式(UID、PID、PPID、启动命令、时间等全量信息)
2.1.2 输出字段完整解读
执行命令后输出固定8列核心字段,是排查进程的关键依据:
bash
plm 38158 1 0 Oct29 ? 00:07:06 java -jar demo.jar
-
UID:启动进程的系统用户(如plm、root)
-
PID:进程唯一ID,启停、杀进程的核心标识
-
PPID:父进程ID,PPID=1代表系统守护进程(nohup后台启动特征)
-
C:CPU占用权重
-
STIME:进程启动时间
-
TTY:运行终端,? 代表后台进程、无绑定终端
-
TIME:进程累计占用CPU时长
-
CMD:进程启动完整命令(用于区分不同服务)
2.2 精准过滤进程(Java服务专用)
2.2.1 基础过滤命令
Nginx可直接过滤nginx关键字,而Java Jar服务进程命令为 java -jar xxx.jar,必须通过jar包名精准过滤,避免匹配到其他Java进程。
bash
# 精准查询自定义Java服务进程,过滤自身grep进程
ps -ef | grep demo.jar | grep -v grep
2.2.2 命令补充释义
-
grep 包名:筛选当前项目的服务进程
-
grep -v grep:反向过滤,排除当前查询命令自身的临时进程,避免干扰判断
2.3 端口监听查询(进程存活≠端口监听)
重点:进程存在,不代表端口正常监听(常见端口冲突、启动异常、线程卡死问题),必须搭配端口查询命令二次校验。
2.3.1 核心命令(优先ss,替代老旧netstat)
bash
# 查看指定端口监听状态
ss -tlnp | grep 8888
2.3.2 参数详解
-
-t:仅展示TCP端口
-
-l:仅展示监听状态的端口
-
-n:纯数字展示端口,不解析域名、协议
-
-p:展示占用端口的进程名称与PID
输出包含java进程即代表:服务Tomcat容器启动成功,端口正常对外开放。
2.4 进程启停标准操作(生产规范)
2.4.1 优雅停止(生产优先使用)
默认发送SIGTERM信号,触发SpringBoot优雅关闭,执行事务提交、连接关闭、资源释放,无数据丢失风险。
bash
kill 进程PID
2.4.2 强制停止(仅兜底使用)
发送SIGKILL信号,系统直接强制销毁进程,程序无任何收尾机会,容易导致事务中断、文件损坏、缓存丢失,生产禁止随意使用。
bash
kill -9 进程PID
2.5 服务三层健康校验标准(开发者必记)
-
进程层:ps查询进程存在 → Java程序已拉起
-
端口层:ss查询端口监听正常 → 服务容器就绪、端口对外开放
-
业务层 :日志查询到
Started Application→ 业务完全启动,可正常处理请求
三、Java Jar 服务生产级启动脚本
日常部署Java服务,手动启停效率低、易出错、无法后台常驻,生产环境统一使用Shell脚本实现一键重启、自动杀旧进程、后台启动、日志归集。下面提供企业通用完整版脚本,并逐行解析核心逻辑与参数。
3.1 完整生产脚本(脱敏通用版)
bash
#!/bin/bash
# 1.统计当前正在运行的项目进程数量
count=`ps aux|grep demo.jar |grep -v grep |wc -l`
# 2.如果进程存在,自动杀死旧进程
if [ $count -ne 0 ];then
ps aux | grep demo.jar | grep -v grep | awk '{print $2}' | xargs kill -9
fi
# 3.加载用户环境变量,保证Java环境生效
source /home/app/.bash_profile
# 4.后台启动Jar服务,指定运行环境、归集日志
nohup java -jar /home/app/demo.jar \
--spring.profiles.active=prod \
> /home/app/log/nohup.log 2>&1
3.2 逐行核心参数详解
3.2.1 进程统计逻辑
bash
count=`ps aux|grep demo.jar |grep -v grep |wc -l`
-
ps aux:查看所有后台进程,适配脚本后台查询场景
-
wc -l:统计匹配到的进程行数,即进程数量
-
count -ne 0:shell判断,进程数不等于0即代表服务正在运行
3.2.2 自动杀进程逻辑
bash
ps aux | grep demo.jar | grep -v grep | awk '{print $2}' | xargs kill -9
-
awk '{print $2}':截取ps输出的第二列内容,即进程PID
-
xargs:将截取的PID作为参数,传递给kill命令执行
3.2.3 环境变量加载
bash
source /home/app/.bash_profile
手动加载用户环境变量,确保脚本执行环境能识别 java 命令、JDK配置,避免脚本启动报java: command not found。
3.2.4 后台启动核心参数(重点)
bash
nohup java -jar demo.jar --spring.profiles.active=prod > nohup.log 2>&1
-
nohup:无挂断启动,脱离SSH终端,关闭窗口、断开连接后服务不中断
-
--spring.profiles.active=prod:指定Spring运行环境,加载application-prod.yml配置文件
-
> 日志文件:将控制台标准输出重定向写入日志文件
-
2>&1:将错误输出(异常堆栈、报错信息)重定向到标准输出,统一归集到日志文件
-
&:后台运行进程,不占用当前终端
3.3 原生脚本优缺点分析
3.3.1 优点
-
一键重启,无需手动查PID、杀进程,部署高效
-
自动归集日志,方便问题排查
-
适配服务器后台运行场景,服务稳定不中断
3.3.2 生产缺陷
-
直接使用
kill -9强杀进程,无优雅关闭逻辑,存在数据丢失、事务中断风险 -
杀完进程立即启动,端口可能处于TIME_WAIT状态,导致端口占用启动失败
-
无启动结果校验,脚本执行完成不代表服务启动成功
3.4 优化版脚本(生产优雅启停)
新增优雅关闭、延迟等待、进程校验逻辑,适配生产高可用场景:
bash
#!/bin/bash
JAR_NAME="demo.jar"
LOG_PATH="/home/app/log/nohup.log"
# 获取进程PID
PID=$(ps aux | grep "$JAR_NAME" | grep -v grep | awk '{print $2}')
# 优雅停机,超时再强杀
if [ -n "$PID" ];then
kill $PID
sleep 3
if ps -p $PID > /dev/null ;then
kill -9 $PID
fi
fi
# 加载环境变量、启动服务
source /home/app/.bash_profile
nohup java -jar /home/app/$JAR_NAME --spring.profiles.active=prod > $LOG_PATH 2>&1
四、整套问题排查终极链路(闭环流程)
-
网络层:ping 主机IP 校验三层网络,curl/telnet 校验端口连通性
-
进程层:ps 查询Java进程是否存在,确认服务已拉起
-
端口层:ss 校验端口正常监听,无端口占用、监听异常
-
业务层:查看启动日志,确认SpringBoot启动完成
-
访问层:调用接口/健康检查接口,确认业务正常响应
五、总结
-
Ping 管主机存活,Telnet/Curl 管端口连通,二者互补,不可替代,ICMP禁用场景下端口探测是唯一有效手段;
-
进程查询不能只看是否存在,必须结合端口监听、启动日志多层校验,杜绝「进程假死、端口未监听」问题;
-
Java服务启动脚本核心是进程管理、环境加载、日志归集,生产环境优先使用优雅启停逻辑,保障服务稳定性。