后端运维:网络联通、进程查询、Java服务启动脚本

后端运维:网络联通、进程查询、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 生产标准排查顺序

  1. ping 目标IP,快速判断三层网络是否通畅;ping不通直接跳过,属于ICMP拦截

  2. 使用 curl/telnet 探测业务端口,校验四层TCP连通性

  3. 端口通畅后,进一步校验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 服务三层健康校验标准(开发者必记)

  1. 进程层:ps查询进程存在 → Java程序已拉起

  2. 端口层:ss查询端口监听正常 → 服务容器就绪、端口对外开放

  3. 业务层 :日志查询到 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 

四、整套问题排查终极链路(闭环流程)

  1. 网络层:ping 主机IP 校验三层网络,curl/telnet 校验端口连通性

  2. 进程层:ps 查询Java进程是否存在,确认服务已拉起

  3. 端口层:ss 校验端口正常监听,无端口占用、监听异常

  4. 业务层:查看启动日志,确认SpringBoot启动完成

  5. 访问层:调用接口/健康检查接口,确认业务正常响应

五、总结

  1. Ping 管主机存活,Telnet/Curl 管端口连通,二者互补,不可替代,ICMP禁用场景下端口探测是唯一有效手段;

  2. 进程查询不能只看是否存在,必须结合端口监听、启动日志多层校验,杜绝「进程假死、端口未监听」问题;

  3. Java服务启动脚本核心是进程管理、环境加载、日志归集,生产环境优先使用优雅启停逻辑,保障服务稳定性。

相关推荐
T_Wizard29 分钟前
后端转 AI 应用开发,我先把这 12 个名词理清了:一张图看懂架构、RAG、Tool Calling 与 MCP
java·ai编程
好用斋29 分钟前
拾光坞安装网盘聚合LitePan:把Docker命令翻译成图形界面
运维·docker·容器
杨航 AI42 分钟前
JEV的用法
java·前端·数据库
灿飞1 小时前
Kotlin与Java虚拟机七:空安全:把十亿美元的错误消灭在类型系统里
java·kotlin
知识搬运临时工1 小时前
JVM 删掉偏向锁之后,一次无竞争锁从 0.3 纳秒变成 5.4 纳秒
java
IT枫斗者枫哥1 小时前
用了BigDecimal还差一分?用四组Java代码查清原因
java·后端
一条泥憨鱼2 小时前
【消息队列】ACK确认了什么:消息队列可靠投递的完整链路
java·后端·kafka·消息队列·rabbitmq
贝锐2 小时前
金仓、达梦、TDSQL全适配:向日葵补齐信创数据库层远程运维能力
运维·数据库·信创
从琳开始9892 小时前
网络原理入门(二)------OSI七层模型?TCP/IP五层(四层)模型原来是这样的
java·网络·tcp/ip·java-ee·php