Linux 下查找运行中的 Java 进程及 .jar 文件位置

Linux 环境中,有时我们需要查找正在运行的 Java 进程以及它们对应的 .jar 文件位置。本文将介绍如何使用命令行工具来实现这一目标。

前言

Linux 系统中,我们经常需要监控正在运行的应用程序,特别是在出现问题时,了解应用程序是如何启动的,以及其 .jar 文件的确切位置是非常有用的。本文将指导您如何查找运行中的 Java 进程以及对应的 .jar 文件位置。


查找运行中的 Java 进程

步骤 1: 使用 ps 命令列出所有 Java 进程

使用 ps 命令结合 grep 来列出所有运行中的 Java 进程:

bash 复制代码
ps aux | grep java

这将列出所有包含 java 字符串的进程。通常情况下,Java 应用程序的进程名中会包含 java 字符串。

示例输出

bash 复制代码
root      1613  1.2 11.8 4679516 949500 ?      Sl   11:07   3:06 java -Dfile.encoding=utf-8 -jar qiein-purchase-0.0.1-SNAPSHOT-exec.jar --spring.profiles.active=local
root      3041  0.0  5.2 3128280 424212 ?      Sl   Aug16  10:16 java -Dfile.encoding=utf-8 -Xmx512m -Xms512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/log/gc -verbose:gc -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintReferenceGC -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar inwuoo-pay-0.0.1-SNAPSHOT.jar
root      3552  0.0  0.0 112644   968 pts/0    S+   15:20   0:00 grep --color=auto java

步骤 2: 获取完整的输出格式,包括列标题

如果您希望看到完整的输出格式,包括列标题,可以使用以下命令:

bash 复制代码
echo "USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND" && ps aux | grep java

示例输出

bash 复制代码
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      1613  1.2 11.8 4679516 949500 ?      Sl   11:07   3:06 java -Dfile.encoding=utf-8 -jar qiein-purchase-0.0.1-SNAPSHOT-exec.jar --spring.profiles.active=local
root      3041  0.0  5.2 3128280 424212 ?      Sl   Aug16  10:16 java -Dfile.encoding=utf-8 -Xmx512m -Xms512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/log/gc -verbose:gc -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintReferenceGC -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar inwuoo-pay-0.0.1-SNAPSHOT.jar
root      3552  0.0  0.0 112644   968 pts/0    S+   15:20   0:00 grep --color=auto java

ps 命令输出列详解

ps 命令输出列提供了关于进程的重要信息。以下是各个列的含义:

  • USER:
    • 含义: 进程的所有者用户名。
    • 用途: 显示哪个用户拥有该进程。
  • PID:
    • 含义: 进程 ID。
    • 用途: 用于唯一标识一个进程。
  • %CPU:
    含义: 进程占用的 CPU 百分比。
    用途: 显示进程当前使用的 CPU 资源比例。
  • %MEM:
    • 含义: 进程占用的物理内存百分比。
    • 用途: 显示进程当前使用的物理内存资源比例。
  • VSZ:
    • 含义: 进程使用的虚拟内存大小(单位通常是字节)。
    • 用途: 显示进程虚拟内存的总大小。
  • RSS:
    • 含义: 进程使用的常驻集大小(单位通常是字节)。
    • 用途: 显示进程实际使用的物理内存大小。
  • TTY:
    • 含义: 终端设备标识符。
    • 用途: 显示进程与哪个终端设备关联。
  • STAT:
    • 含义: 进程状态。
    • 用途: 显示进程的状态,如运行中(R)、睡眠(S)、停止(T)等。
  • START:
    • 含义: 进程启动的时间。
    • 用途: 显示进程开始运行的时间点。
  • TIME:
    • 含义: 进程累计运行时间。
    • 用途: 显示进程自启动以来累计使用 CPU 的时间。
  • COMMAND:
    • 含义: 进程执行的命令。
    • 用途: 显示启动进程时使用的命令行参数。

查看该进程的详细命令行参数

在列出的进程中找到您感兴趣的 Java 进程,并注意它的进程 ID(PID)。然后使用 ps 命令加上 -p 和 -o 参数来查看该进程的详细命令行参数:

bash 复制代码
ps -p <PID> -o args=

示例

bash 复制代码
java -Dfile.encoding=utf-8 -jar xx.jar --spring.profiles.active=prod

查找 .jar 文件位置

步骤 1: 获取 Java 进程的工作目录

使用 ps 命令来获取 Java 进程的工作目录:

bash 复制代码
ps -p <PID> -o cwd=

注意⚠️:这里的 <PID> 是您在第一步中找到的 Java 进程的 PID。

示例

假设您找到了 Java 进程的 PID 为 1613,您可以使用以下命令来获取该进程的工作目录:

bash 复制代码
ps -p 1613 -o cwd=

步骤 2: 在工作目录中查找 .jar 文件

接下来,在获取到的工作目录中查找 .jar 文件。您可以使用 find 命令来查找 .jar 文件:

bash 复制代码
find /path/to/jar/directory -name "*.jar"

示例

假设您已经获得了工作目录为 /path/to/jar/directory,您可以使用以下命令来查找 .jar 文件:

bash 复制代码
find /path/to/jar/directory -name "*.jar"

步骤 3: 处理未显示工作目录的情况

如果使用 ps -p <PID> -o cwd= 命令输出 -,这意味着进程的工作目录没有被正确报告。您可以尝试使用以下命令来获取进程的工作目录:

bash 复制代码
ls -l /proc/<PID>/cwd

示例

假设您已经确认了 Java 进程的 PID 为 1613,并且您以 root 用户身份运行命令,但仍然得到了 - 在这里插入代码片的输出,您可以尝试使用 ls -l /proc/1613/cwd

bash 复制代码
ls -l /proc/1613/cwd

示例输出

bash 复制代码
total 0
drwxr-xr-x 2 root root 4096 Aug 29 12:34 .
drwxr-xr-x 3 root root 4096 Aug 29 12:34 ..
drwxr-xr-x 4 root root 4096 Aug 29 12:34 lib

从上面的输出中,我们可以看到 /proc/1613/cwd 指向的工作目录。通常情况下,这会是一个符号链接指向实际的工作目录。

最后

通过上述步骤,您可以找到运行中的 Java 进程以及对应的 .jar 文件位置。这对于诊断和管理应用程序非常有用。希望这篇文章对您有所帮助!

相关推荐
better_liang8 小时前
每日Java面试场景题知识点之-消息队列MQ核心场景与实战
java·面试·kafka·消息队列·rabbitmq·rocketmq·mq
小江的记录本8 小时前
【JVM虚拟机】垃圾回收GC:四种引用类型:强引用、软引用、弱引用、虚引用(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·后端·python·spring·面试
小马爱打代码8 小时前
Spring源码 第四篇:Spring 5 源码深度拆解:AOP 全流程核心原理
java·后端·spring
better_liang9 小时前
每日Java面试场景题知识点之-SpringBoot启动流程
java·面试·springboot·源码解析·启动流程
RyFit9 小时前
Java + AI 实战:Spring AI 从入门到企业级落地
java·人工智能·spring
wljy19 小时前
二、进制状态转换
linux·运维·服务器·c语言·c++
week@eight9 小时前
Linux - Doris
linux·运维·数据库·mysql
平行云9 小时前
实时云渲染预启动技术解析:UE数字孪生应用的延迟优化机制(二)
linux·unity·ue5·webgl·实时云渲染·云桌面·像素流
看到代码头都是大的10 小时前
CentOS环境下手动升级openssl、openssh
linux·运维·centos
浮生若城10 小时前
Linux——Ext系列文件系统
linux·运维·服务器