Skip to content

常用 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 找出正在执行的代码行数。

📝 详细的四步排查大法(背熟这个流程):

  1. 第一步:找元凶进程(PID)
    • 敲 top 命令,看第一行的数据。如果 load average(系统负载)很高,且找到了占据 CPU 90% 以上的 Java 进程。记下它的进程 ID(比如是 1001)。
  2. 第二步:找元凶线程(TID)
    • 敲 top -Hp 1001。这会显示进程 1001 下面的所有线程。找到消耗 CPU 最高的那一个线程,记下它的线程 ID(比如是 1010)。
  3. 第三步:将 TID 转成十六进制
    • 因为 JVM 的堆栈信息里,线程 ID 是用十六进制表示的。用命令 printf "%x\n" 1010 把它转成十六进制,比如得到 3f2。
  4. 第四步:通过 jstack 定位死循环代码
    • 敲 jstack 1001 | grep -A 20 '3f2'(把进程栈导出来,并在里面搜这个十六进制的线程 ID,显示前后 20 行)。
    • 结果:这时候控制台上就会清晰地打印出这个疯狂占用 CPU 的线程正在执行哪个类的哪一行代码。通常会发现是一个业务代码写了死循环,或者一直在做极耗 CPU 的正则匹配/大量对象计算。赶紧下线机器去改代码!

❓ 面试官:线上系统报错 OOM(内存溢出),你是怎么排查的?【中级】 ​

频率:🔥🔥🔥🔥

💡 一句话总结(先抛结论): OOM 发生时不能靠猜。核心手段是获取系统崩溃瞬间的 Heap Dump(堆内存快照)文件,然后用可视化工具(如 MAT 或 JVisualVM)分析是哪个大对象把内存撑爆了。

📝 详细排查实战:

  1. 事前防御:开启自动 Dump
    • 在 Java 项目启动参数中,我一定会加上: -XX:+HeapDumpOnOutOfMemoryError(发生 OOM 时自动生成 dump 文件) -XX:HeapDumpPath=/log/heapdump.hprof(指定生成路径)。
    • 否则 OOM 时进程直接退出,神仙也查不出当时内存里有啥。
  2. 事发取证
    • 发生 OOM 报警后,去服务器上的 /log/ 目录把那个 .hprof 快照文件下载到本地电脑。
  3. 事后分析
    • 用 Eclipse MAT(Memory Analyzer Tool)打开快照文件。
    • 看它的 "Leak Suspects"(泄漏嫌疑人) 报告。它会直接用大饼图告诉你:“有 90% 的内存都被一个叫 ArrayList 的对象占据,里面塞满了 UserEntity 对象”。
    • 顺藤摸瓜点进去,能看到这些对象的创建引用链,最后定位到:原来是一段老代码在执行 select * from user 忘了加分页条件,一下子把数据库里 200 万用户全查到内存里,导致了 OOM。
  4. 修复与总结
    • 加上分页查询逻辑,发布上线。

❓ 面试官:说一下 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(自己可写,别人只能读和执行)或者用作临时调试,调试完立马改回去。