在 Linux
环境中,有时我们需要查找正在运行的 Java
进程以及它们对应的 .jar
文件位置。本文将介绍如何使用命令行工具来实现这一目标。
前言
在 Linux
系统中,我们经常需要监控正在运行的应用程序,特别是在出现问题时,了解应用程序是如何启动的,以及其 .jar
文件的确切位置是非常有用的。本文将指导您如何查找运行中的 Java
进程以及对应的 .jar
文件位置。
查找运行中的 Java 进程
步骤 1: 使用 ps 命令列出所有 Java 进程
使用 ps 命令结合 grep 来列出所有运行中的 Java 进程:
ps aux | grep java
这将列出所有包含 java
字符串的进程。通常情况下,Java
应用程序的进程名中会包含 java
字符串。
示例输出
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: 获取完整的输出格式,包括列标题
如果您希望看到完整的输出格式,包括列标题,可以使用以下命令:
echo "USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND" && ps aux | grep java
示例输出
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 参数来查看该进程的详细命令行参数:
ps -p <PID> -o args=
示例
java -Dfile.encoding=utf-8 -jar xx.jar --spring.profiles.active=prod
查找 .jar 文件位置
步骤 1: 获取 Java 进程的工作目录
使用 ps 命令来获取 Java 进程的工作目录:
ps -p <PID> -o cwd=
注意⚠️:这里的 <PID>
是您在第一步中找到的 Java 进程的 PID。
示例
假设您找到了 Java 进程的 PID 为 1613,您可以使用以下命令来获取该进程的工作目录:
ps -p 1613 -o cwd=
步骤 2: 在工作目录中查找 .jar 文件
接下来,在获取到的工作目录中查找 .jar 文件。您可以使用 find 命令来查找 .jar 文件:
find /path/to/jar/directory -name "*.jar"
示例
假设您已经获得了工作目录为 /path/to/jar/directory,您可以使用以下命令来查找 .jar 文件:
find /path/to/jar/directory -name "*.jar"
步骤 3: 处理未显示工作目录的情况
如果使用 ps -p <PID> -o cwd=
命令输出 -
,这意味着进程的工作目录没有被正确报告。您可以尝试使用以下命令来获取进程的工作目录:
ls -l /proc/<PID>/cwd
示例
假设您已经确认了 Java 进程的 PID
为 1613,并且您以 root 用户身份运行命令,但仍然得到了 - 在这里插入代码片
的输出,您可以尝试使用 ls -l /proc/1613/cwd
:
ls -l /proc/1613/cwd
示例输出
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
文件位置。这对于诊断和管理应用程序非常有用。希望这篇文章对您有所帮助!