跳至主要內容

Mr.Hope大约 12 分钟

引言

应用上线后响应突然变慢、日志文件暴增占满磁盘、Java 进程莫名消失——面对这些生产环境的紧急状况,如果你只会说"找运维看看",那离成为独立的技术骨干就还差关键一步。实际上,90% 的线上问题都可以通过 Linux 命令快速定位。本文将围绕 Java 应用的生命周期和常见故障场景,系统梳理进程监控、日志分析、网络诊断、资源管理等核心命令。读完本文,你将建立一套完整的 Linux 排查工作流,面试中的场景题也能从容应对。


Linux 常用命令:Java 开发者必备的核心技能

为什么 Java 开发者需要掌握 Linux 常用命令?

你可能会说,"我只会写 Java 代码,有专门的运维人员负责服务器"。然而,当你面对以下场景时,你会发现 Linux 命令是多么不可或缺:

  • 应用启动失败: 你需要查看日志文件来确定原因。
  • 应用性能缓慢: 你需要检查服务器的 CPU、内存、磁盘、网络使用情况,找到性能瓶颈。
  • 应用内存溢出(OOM): 你需要找到 Java 进程 ID,获取线程 Dump 或 Heap Dump 进行分析。
  • 应用进程僵死或失控: 你需要能够查找并终止 Java 进程。
  • 部署应用: 你需要上传、解压、移动、配置应用发布包。
  • 检查端口占用: 你的应用启动失败,提示端口已被占用。
  • 解决文件权限问题: 你的应用没有权限读写某个文件。

掌握 Linux 命令,让你能够:

  • 独立排查问题: 不再依赖运维人员,能够快速初步诊断和解决问题。
  • 提升工作效率: 自动化一些重复性任务,快速查看系统状态和日志。
  • 更好地理解部署环境: 了解你的应用在底层是如何运行的。
  • 应对面试挑战: 面试官通过场景题考察你解决实际问题的能力。

Linux 命令基础回顾

一个 Linux 命令通常由以下部分组成:

command [options] [arguments]
  • command:命令本身,如 lscdps
  • options:选项,用于修改命令的行为,通常以 --- 开头,如 ls -lps aux
  • arguments:参数,命令操作的对象,如文件名、目录名、进程 ID 等,如 cd /homerm file.txtkill 12345

常用操作:

  • 查看命令帮助:man commandcommand --help
  • 切换用户:su usernamesudo command
  • 远程登录:ssh user@hostname

Java 应用排查工作流

进程管理与监控

理解应用的运行状态,查找进程 ID,是排障的第一步。

常用进程命令

命令功能Java 场景用法关键输出
ps aux查看所有进程ps aux | grep java 查找 Java 进程PID, CPU%, MEM%
ps -ef完整格式显示ps -ef | grep java 含父进程 PIDPPID, COMMAND
top实时资源监控P 按 CPU 排序,按 M 按内存排序Load Average, CPU%, MEM%
top -Hp <pid>查看线程 CPU定位高 CPU 线程线程 ID(转 16 进制查 jstack)
jps -l查看 Java 进程jps -l 快速找到 Java 进程 PID完整类名/JAR 路径
jps -v查看 Java 启动参数jps -v 查看 JVM 参数JVM 启动参数

💡 核心提示:排查 CPU 飙高的标准流程:top 找到高 CPU 进程 -> top -Hp <pid> 找到高 CPU 线程 -> printf "%x\n" <线程ID> 转 16 进制 -> jstack <pid> 中找到对应线程堆栈 -> 分析代码位置。

线程与 JVM 诊断

  • jstack(JVM Stack Trace): JDK 自带工具,用于生成 JVM 线程堆栈快照(Thread Dump)。

    • jstack <pid>:生成指定 PID 进程的所有线程堆栈信息。
    • jstack -l <pid>:生成额外的锁信息。
    • jstack -F <pid>:强制生成(如果进程无响应)。
    • jstack <pid> > thread_dump.log 将线程 Dump 输出到文件进行离线分析。
    • 排障场景: 应用无响应(排查死锁或线程长时间阻塞);CPU 使用率高(结合 top -Hp <pid> 找到高 CPU 线程 ID,在 jstack 输出中查找对应的线程,分析其堆栈)。
  • jstat(JVM Statistics Monitoring Tool): JDK 自带工具,用于监控 JVM 各种运行状态信息。

    • jstat -gc <pid> 1000 10:每隔 1 秒(1000ms)打印一次指定 PID 进程的 GC 统计信息,共打印 10 次。
    • 关键指标: S0C/S1U(Survivor 区使用)、EC/EU(Eden 区使用)、OC/OU(老年代使用)、MC/MU(元空间使用)、YGC/YGT(Young GC 次数/耗时)、FGC/FGT(Full GC 次数/耗时)。
    • 排障场景: 监控堆内存使用趋势,判断是否即将 OOM;分析 GC 频繁度或 Full GC 耗时。

进程控制

  • kill 终止指定 PID 的进程。
    • kill <pid>:发送 SIGTERM 信号(优雅终止,进程可以捕获信号并清理资源)。
    • kill -9 <pid>:发送 SIGKILL 信号(强制终止,进程无法捕获,可能导致数据丢失)。慎用!

文件系统操作与管理

定位应用部署目录、日志文件是日常操作。

常用文件命令

命令功能常用用法排障场景
ls -lh列出文件详情ls -lh /app/logs/ 查看日志文件大小确认文件是否存在、大小
cd切换目录cd /app/logs/ 进入日志目录定位到工作目录
pwd显示当前路径确认当前所在目录避免在错误目录下操作
find搜索文件find . -name "*.log" find . -size +1G定位大型日志文件
df -h磁盘使用情况df -h 检查磁盘空间磁盘满导致写入失败
du -sh目录占用空间du -sh /app/logs/ 汇总日志目录大小定位占用空间的大目录
mkdir / rm / cp / mv文件操作rm -r dir cp file /tmp部署时管理文件

文本处理与日志查看

查看和分析应用日志是排查问题的核心手段。

常用日志命令

命令功能Java 场景用法说明
tail -f实时追踪文件末尾tail -f app.log实时查看日志输出
tail -n 100查看文件末尾 N 行tail -n 100 app.log查看最新 100 行日志
grep搜索匹配行grep "ERROR" app.log搜索错误信息
grep -C 3显示上下文grep -C 3 "关键字" app.log查看匹配行前后各 3 行
grep -n显示行号grep -n "NullPointerException" app.log定位错误行号
less分页查看less big_log.log(按 / 搜索)大文件分页浏览
head查看文件头部head -n 20 app.log查看文件开头内容

💡 核心提示:组合命令 tail -f app.log | grep "ERROR" 可以实时过滤并显示错误日志,是排查生产问题最常用的组合之一。

网络诊断

检查应用的网络连通性、端口占用是常见任务。

命令功能Java 场景用法关键输出
ping测试连通性ping db-server 检查数据库连通性延迟、丢包率
nc -vz测试端口可达nc -vz db-server 3306端口是否开放
ss -tulnp查看监听端口ss -tulnp | grep 8080监听端口及对应进程
ss -ant查看所有 TCP 连接ss -ant连接状态(LISTEN, ESTABLISHED, TIME_WAIT)
curlHTTP 请求测试curl http://localhost:8080/api/status接口响应内容
  • netstat / ss ss 是新一代工具,速度更快。
    • ss -tulnp:显示所有监听的 TCP/UDP 端口及其对应的进程 PID 和程序名。用于检查应用监听的端口是否正常,或哪个进程占用了端口。
    • ss -ant:显示所有 TCP 连接及其状态(LISTEN, ESTABLISHED, TIME_WAIT 等)。

系统信息与资源

了解服务器整体健康状况。

命令功能用法关键输出
free -h内存使用情况free -htotal, used, available, Swap
uptime系统负载uptimeLoad Average(1/5/15 分钟)
whoami / id用户信息whoami 确认当前用户当前用户名和组

💡 核心提示:Load Average 的值与 CPU 核数相关。如果 Load Average 持续大于 CPU 核数,说明 CPU 存在瓶颈。4 核机器 Load Average 超过 4,意味着有进程在排队等待 CPU。

权限与用户

解决应用运行时的权限问题。

命令功能Java 场景用法
whoami / id显示用户信息确认当前用户是否有权限操作
chmod修改文件权限chmod 755 file.sh chmod +x script.sh
chown修改文件所有者chown user:group file.txt
sudo以其他用户执行sudo systemctl restart your-app

打包与压缩

应用发布包的常见格式处理。

# 创建 gzip 压缩包
tar -czvf archive.tar.gz file1 dir1

# 解压 gzip 压缩包
tar -xzvf archive.tar.gz

# 查看压缩包内容(不解压)
tar -tzvf archive.tar.gz

生产环境常用命令速查

# 1. 查找 Java 进程
jps -l

# 2. 查看进程资源占用
top -Hp <pid>

# 3. 查看 GC 情况
jstat -gc <pid> 1000 10

# 4. 生成线程 Dump
jstack <pid> > thread_dump.log

# 5. 实时查看错误日志
tail -f app.log | grep "ERROR"

# 6. 检查端口占用
ss -tulnp | grep 8080

# 7. 检查磁盘空间
df -h

# 8. 查找大文件
find /app -size +500M

# 9. 清理 7 天前的日志
find /app/logs -name "*.log" -mtime +7 -delete

面试问题示例与深度解析

  • "如果你的 Java 服务突然响应很慢,你会怎么排查?"(首先 top 查看系统整体资源占用。如果 CPU 高,用 top -Hp <pid> 找到高 CPU 线程 ID,然后用 jstack <pid> 生成线程 Dump,将线程 ID 转为 16 进制在 Dump 文件中查找对应线程状态。如果内存高,用 jstat -gc <pid> 看 GC 情况。用 tail -fgrep 查看日志是否有异常。)
  • "如何在一个运行的 Linux 服务器上找到你的 Java 应用程序进程,并查看它的启动参数?"(用 jps -l 找到 PID,再用 jps -v <pid> 查看完整命令和参数。)
  • "你的 Java 应用日志文件很大,你如何快速查看最新的 100 行日志和搜索包含 'OutOfMemoryError' 的行?"(最新 100 行用 tail -n 100 file.log;搜索用 grep "OutOfMemoryError" file.log。)
  • "应用提示端口被占用了,如何找到占用这个端口的进程?"(用 ss -tulnp \| grep 端口号,查看输出中的 PID 和程序名。)
  • "如何检查服务器的磁盘空间是否快满了?"(用 df -h 查看磁盘使用率;用 du -sh dir_path 查找大目录。)

总结

对于中高级 Java 开发者而言,掌握 Linux 常用命令不再是可选项,而是必备项。它们是你在 Linux 环境下与 Java 应用交互、进行日常管理和高效排查问题的核心技能。

熟练运用 pstopjpsjstackjstat 进行进程和 JVM 监控;运用 lscdfinddfdu 进行文件系统管理;运用 tailgrepless 进行日志查看和分析;运用 ssnccurl 进行网络诊断;以及运用 chmodchownsudo 处理权限问题,将极大地提升你的独立工作能力和问题解决效率。

生产环境避坑指南

  1. 慎用 kill -9 强制终止进程可能导致数据不一致、文件未刷盘、连接未正常关闭等问题。优先使用 kill(SIGTERM)让 Java 进程优雅关闭,配合 Shutdown Hook 执行清理逻辑。
  2. 避免 rm -rf / 类误操作: 使用 rm 前务必确认当前目录和目标路径。建议在 ~/.bashrc 中设置 alias rm='rm -i'(交互确认模式)。
  3. 日志文件定期清理: 未清理的日志文件可能占满磁盘空间。使用 logrotate 配置日志轮转,或定期执行 find /app/logs -mtime +7 -delete 清理旧日志。
  4. 大文件查找优化: 在大目录中使用 find 时避免使用 find / -name xxx(全磁盘扫描)。缩小搜索范围,如 find /app/logs -name "*.log"
  5. jstat 输出解读陷阱: jstat 的 S0/S1 表示 Survivor 区使用率,不是 S0 和 S1 同时使用,而是交替使用。如果两个都为 0,说明 GC 异常。
  6. 远程命令安全: 避免在命令行中明文传递密码或敏感信息。使用密钥认证(SSH Key)替代密码认证。
  7. 命令输出管道陷阱: tail -f | grep 管道中如果 grep 进程退出,tail 可能继续运行。使用 tail -f app.log | grep --line-buffered "ERROR" 确保实时输出。

行动清单

  1. 环境自检: 在生产服务器上执行 jps -lss -tulnpdf -hfree -h 四个命令,快速掌握应用运行状态。
  2. 建立排查 SOP: 将本文中的排查工作流整理为团队的标准操作手册(SOP),贴在运维文档中。
  3. 配置日志轮转: 检查服务器上的 logrotate 配置,确保 Java 日志文件按天轮转并保留不超过 30 天。
  4. 掌握 JVM 诊断链: 练习 top -> top -Hp -> printf "%x" -> jstack 的完整排查流程。
  5. 扩展阅读: 推荐阅读《深入理解 Java 虚拟机》中关于 JVM 排查工具的章节;学习 Arthas(阿里巴巴开源的 Java 诊断工具)作为 jstack/jstat 的增强替代方案。