常用 Linux 命令与线上排查实战
❓ 面试官:日常开发和线上排查,你最常用哪些 Linux 命令?
频率:🔥🔥🔥🔥🔥
💡 一句话总结(先抛结论): 面试回答这个问题,不要干巴巴地背 ls、cd、pwd。一定要结合具体的后端工作场景分类来答,体现你不仅懂命令,还懂排查思路。
📝 场景化高分回答剧本:
"我平时主要在以下三个场景使用 Linux 命令:"
场景一:排查日志与搜索文件(最常用)
tail -f xxx.log:看最新的实时滚动日志。通常配合grep,比如tail -f info.log | grep 'NullPointer'只看报错的日志。less xxx.log:看大日志文件。用/搜索关键字,N找下一个,不占用内存,比cat安全。grep -n '订单号' xxx.log:全量搜寻某个订单的出错记录,并显示行号。find / -name "*.jar":全盘搜索不知道放哪里的 jar 包或者配置文件。
场景二:查看网络连接与端口号占用
netstat -nltp | grep 8080:起项目报错端口被占用时,用这个查谁占了 8080 端口,拿到 PID 后用kill -9杀掉。ping和telnet ip port:如果是分布式服务调不通,先ping看网络通不通,再telnet看对方防火墙有没有开这个端口。
场景三:排查服务器性能(CPU/内存/磁盘)
top:查看整个系统的 CPU 和内存使用率,类似 Windows 的任务管理器。free -h:直观查看系统的可用内存(带单位 G/M)。df -h:看磁盘有没有被打满,如果是100%,会导致 MySQL 挂掉或者日志写不进去。
❓ 面试官:如果线上系统突然变得非常卡,你怎么排查?(线上 CPU 飙高排查流程)【中级】
频率:🔥🔥🔥🔥
💡 一句话总结(先抛结论): 排查思路是:定位高负载进程 -> 定位高负载线程 -> 线程 ID 转十六进制 -> 通过 jstack 找出正在执行的代码行数。
📝 详细的四步排查大法(背熟这个流程):
- 第一步:找元凶进程(PID)
- 敲
top命令,看第一行的数据。如果load average(系统负载)很高,且找到了占据 CPU 90% 以上的 Java 进程。记下它的进程 ID(比如是1001)。
- 敲
- 第二步:找元凶线程(TID)
- 敲
top -Hp 1001。这会显示进程1001下面的所有线程。找到消耗 CPU 最高的那一个线程,记下它的线程 ID(比如是1010)。
- 敲
- 第三步:将 TID 转成十六进制
- 因为 JVM 的堆栈信息里,线程 ID 是用十六进制表示的。用命令
printf "%x\n" 1010把它转成十六进制,比如得到3f2。
- 因为 JVM 的堆栈信息里,线程 ID 是用十六进制表示的。用命令
- 第四步:通过 jstack 定位死循环代码
- 敲
jstack 1001 | grep -A 20 '3f2'(把进程栈导出来,并在里面搜这个十六进制的线程 ID,显示前后 20 行)。 - 结果:这时候控制台上就会清晰地打印出这个疯狂占用 CPU 的线程正在执行哪个类的哪一行代码。通常会发现是一个业务代码写了死循环,或者一直在做极耗 CPU 的正则匹配/大量对象计算。赶紧下线机器去改代码!
- 敲
❓ 面试官:线上系统报错 OOM(内存溢出),你是怎么排查的?【中级】
频率:🔥🔥🔥🔥
💡 一句话总结(先抛结论): OOM 发生时不能靠猜。核心手段是获取系统崩溃瞬间的 Heap Dump(堆内存快照)文件,然后用可视化工具(如 MAT 或 JVisualVM)分析是哪个大对象把内存撑爆了。
📝 详细排查实战:
- 事前防御:开启自动 Dump
- 在 Java 项目启动参数中,我一定会加上:
-XX:+HeapDumpOnOutOfMemoryError(发生 OOM 时自动生成 dump 文件)-XX:HeapDumpPath=/log/heapdump.hprof(指定生成路径)。 - 否则 OOM 时进程直接退出,神仙也查不出当时内存里有啥。
- 在 Java 项目启动参数中,我一定会加上:
- 事发取证
- 发生 OOM 报警后,去服务器上的
/log/目录把那个.hprof快照文件下载到本地电脑。
- 发生 OOM 报警后,去服务器上的
- 事后分析
- 用 Eclipse MAT(Memory Analyzer Tool)打开快照文件。
- 看它的 "Leak Suspects"(泄漏嫌疑人) 报告。它会直接用大饼图告诉你:“有 90% 的内存都被一个叫
ArrayList的对象占据,里面塞满了UserEntity对象”。 - 顺藤摸瓜点进去,能看到这些对象的创建引用链,最后定位到:原来是一段老代码在执行
select * from user忘了加分页条件,一下子把数据库里 200 万用户全查到内存里,导致了 OOM。
- 修复与总结
- 加上分页查询逻辑,发布上线。
❓ 面试官:说一下 chmod 命令的作用?chmod 777 代表什么意思?
频率:🔥🔥
💡 一句话总结(先抛结论):chmod 用来修改文件或目录的读(r)、写(w)、执行(x)权限。
📝 详细解释:
- Linux 中,权限分为三组:所有者(User)、同组用户(Group)、其他用户(Other)。
- 权限的分值:读
r = 4,写w = 2,执行x = 1。没有权限就是0。 777解析:- 第一个 7(4+2+1):文件所有者拥有读、写、执行的全部权限。
- 第二个 7:同组用户拥有读、写、执行的全部权限。
- 第三个 7:其他任意用户拥有读、写、执行的全部权限。
- 实战注意:在生产环境中,千万不要乱用
chmod 777(谁都能改谁都能删,极度危险)。一般给个chmod 755(自己可写,别人只能读和执行)或者用作临时调试,调试完立马改回去。