在linux系统中部署java应用后,经常需要确认对应的java进程是否处于运行状态,不同的查看方式适用于不同的使用场景,下面介绍几种常用的方法。

使用ps命令结合grep过滤查看
ps是linux系统自带的进程查看命令,结合grep可以过滤出包含java关键字的进程,是最常用的排查方式之一。
基础命令如下:
# 查看所有包含java关键字的进程 ps -ef | grep java
执行命令后,输出结果中如果包含java应用的启动信息,说明进程存在。如果只有grep java这一行结果,说明当前没有运行中的java进程。
为了更精准地匹配目标java进程,可以避免匹配到grep本身的进程,使用如下命令:
# 排除grep进程本身的干扰 ps -ef | grep java | grep -v grep
如果需要查看更详细的进程信息,比如进程启动时间、内存占用等,可以调整ps的参数:
# 查看java进程的PID、启动时间、内存占用 ps -eo pid,user,start_time,%mem,cmd | grep java | grep -v grep
使用jps命令查看java进程
jps是jdk自带的一个工具,专门用于查看当前系统中所有的java进程,输出结果比ps命令更简洁,只会展示java相关的进程信息。
基础使用命令如下:
# 查看所有java进程,输出PID和主类名 jps
如果需要查看更完整的进程启动参数,可以使用-v参数:
# 查看java进程的启动参数 jps -v
注意:如果系统中没有配置jdk的环境变量,可能需要使用jdk安装目录下的bin路径来执行jps命令,例如:
# 指定jdk路径执行jps /usr/local/jdk1.8.0_301/bin/jps
使用pgrep命令快速查询
pgrep命令可以直接根据进程名或者进程属性来查询进程的PID,使用起来更加简洁,适合只需要确认进程是否存在、获取PID的场景。
查看java进程是否存在并获取PID的命令如下:
# 查询java进程的PID,存在则返回PID,不存在则无输出 pgrep -f java
参数-f表示匹配完整的进程命令行,避免只匹配进程名导致漏查的情况。如果需要同时输出进程名,可以加上-l参数:
# 输出java进程的PID和完整命令行 pgrep -fl java
不同方法的适用场景对比
下面通过表格对比几种方法的优缺点和适用场景:
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| ps+grep | 系统自带,无需额外依赖,支持自定义过滤条件 | 可能匹配到无关进程,需要额外排除grep进程 | 所有linux系统,需要查看详细进程信息时使用 |
| jps | 只展示java进程,输出简洁,无需额外过滤 | 依赖jdk环境,非java进程无法查询 | 已安装jdk的系统,快速查看java进程时使用 |
| pgrep | 命令简洁,直接返回PID,适合脚本调用 | 输出信息较少,无法查看详细进程属性 | 脚本中判断进程是否存在、获取PID时使用 |
脚本中判断java进程是否存在的示例
在编写运维脚本时,经常需要判断java进程是否存在,然后执行对应的操作,下面是一个简单的shell脚本示例:
#!/bin/bash
# 定义java进程的关键字,比如应用的jar包名
PROCESS_KEY="myapp.jar"
# 使用pgrep查询进程
PID=$(pgrep -f $PROCESS_KEY)
if [ -n "$PID" ]; then
echo "java进程存在,PID为:$PID"
else
echo "java进程不存在,准备启动应用"
# 这里可以添加启动java应用的命令
# nohup java -jar myapp.jar > app.log 2>&1 &
fi
上述脚本中,通过-n判断变量PID是否为空,如果不为空说明进程存在,否则进程不存在。在实际使用时,可以把PROCESS_KEY替换成自己java应用的唯一标识,比如jar包名、主类名等。
注意:如果使用ps命令查询进程,在脚本中判断时需要注意排除grep进程,否则可能会出现误判的情况。另外如果java进程是容器内的进程,需要在对应的容器内部执行上述命令,或者在宿主机上使用docker exec等命令进入容器查询。