Skip to main content
Version: 1.0

Linux 故障排查与面试题精讲

本篇分两部分:先给出运维面试最常考的 5 类故障排查思路(面试官爱问「遇到 XX 问题你怎么排查」,考的是方法论而不是背命令),再对 12 道 Linux 高频面试题逐题详解。

一、常见故障排查思路​

1. 远程连不上服务器​

排查链条(由网络到服务,逐层递进):

  1. ping <IP> 测试网络连通性——不通查网络、路由、云安全组;
  2. ss -tlnp | grep sshd 确认 22 端口是否监听;
  3. 检查防火墙是否放行 22 端口;
  4. systemctl status sshd 检查 sshd 服务状态;
  5. journalctl -u sshd / /var/log/secure 查看 sshd 日志找具体报错(如密码错误、密钥被拒、DenyUsers)。

2. Web 网站打不开​

排查链条:

  1. ping 服务器通不通 →
  2. 端口是否通(curl -I http://IP 或 telnet IP 80)→
  3. 服务是否 running(systemctl status nginx)→
  4. 配置语法是否正确(nginx -t)→
  5. 网页文件路径与权限是否正确 →
  6. 防火墙是否放行 →
  7. 查看错误日志(/var/log/nginx/error.log)定位最终原因。

3. 磁盘空间满​

  1. df -h 查看哪个分区占用满;
  2. du -sh /var/* | sort -rh 在该分区内逐级找大目录/大文件;
  3. 清理日志、临时文件,或扩容;
  4. 经典陷阱:文件被进程占用时,删除文件空间不会释放——文件被删但进程仍持有文件描述符,du 看不到它,df 却仍计入占用。处理方法:重启对应进程释放描述符(或 lsof | grep deleted 找到进程)。

4. CPU 占用高​

  1. top 按 P 排序,定位占用高的进程;
  2. 看进程是什么业务(可能是死循环、正则回溯、慢 SQL);
  3. tail 查看该进程/应用的日志找触发原因;
  4. 确认后再决定是优化代码、限流还是重启。

5. 内存异常​

  1. free -h 查看内存,区分 buff/cache 和真实占用——Linux 会把空闲内存用作缓存,看 available 字段判断真实可用量;
  2. 内存真实告急时,内核 OOM Killer 会自动杀掉占用内存最大的进程,表现就是「服务莫名消失」——去 dmesg | grep -i oom 或 /var/log/messages 找 OOM 记录;
  3. 处理:加内存、限制进程内存(如 JVM 堆参数)、优化内存泄漏。

二、Linux 面试题精讲(12 题)​

1. 简述软链接和硬链接的区别?​

答: 软链接(符号链接)是一个独立文件,内容是源文件的路径,类似 Windows 快捷方式;源文件删除后软链接失效,可以跨分区,也可以对目录创建。硬链接是多个文件名指向同一个 inode,删除其中一个名字文件数据仍在(inode 引用计数机制);硬链接不能跨分区(inode 号只在分区内唯一),也不能对目录创建(避免目录环)。

2. nohup 和 & 后台运行有什么区别?​

答: & 只是把命令放到后台执行,进程仍挂在当前终端会话下,终端关闭或 SSH 断开时收到 SIGHUP 信号会退出。nohup 让进程忽略挂断信号、脱离终端运行,输出默认重定向到 nohup.out。生产上长驻任务应使用 nohup command &(或 systemd、screen/tmux)。

3. 什么是僵尸进程?如何产生?​

答: 僵尸进程是子进程已退出,但父进程没有调用 wait 回收子进程的退出状态,导致子进程的进程描述符仍保留在进程表中(状态为 Z)。产生方式就是「子进程退出而父进程既不 wait 也不退出」。危害是占用进程号(PID)资源;处理办法是杀掉父进程,让 init 接管完成回收,根本上要修复父进程的回收逻辑。

4. systemctl enable 开启开机自启,底层做了什么?​

答: 在 /etc/systemd/system/multi-user.target.wants/ 目录下创建指向该服务 unit 文件(位于 /usr/lib/systemd/system/)的符号链接。系统开机进入 multi-user.target 时会拉起 wants 目录下所有服务。相对地,disable 就是删除这个软链接。

5. tail -f 和 tail -F 的区别是什么?​

答: tail -f 跟踪的是文件描述符,文件被删除(如日志轮转重命名)后停止跟踪;tail -F 跟踪的是文件名,文件被删除重建后会继续跟踪新文件。看会被 logrotate 轮转的日志时应使用 tail -F。

6. Nginx 和 Apache(httpd)对比,各自特点和适用场景?​

答: Nginx 采用事件驱动的异步非阻塞模型,并发能力强、资源占用低,适合高并发静态资源服务和反向代理/负载均衡入口;Apache 采用多进程模型,稳定性好、生态成熟(如 .htaccess、动态模块),但每个连接占用更多资源,并发能力弱于 Nginx。典型组合是 Nginx 在前做入口反代,后端动态业务可搭配 Apache 或应用服务器。

7. 企业集群中为什么所有服务器要做时间同步?一般用什么服务?​

答: 因为日志分析、数据库主从复制、分布式锁/证书校验、定时任务等都需要全局一致的时间基准:时间不一致会导致日志无法对齐排序、主从复制数据错乱、定时任务执行顺序错乱。一般使用 chrony(服务名 chronyd,UDP 123),它替代了老的 ntpd,同步速度更快、对不稳定网络适应性更好。用 chronyc sources / chronyc tracking 验证同步状态。

8. SSH 服务如何提升安全性,有哪些常用配置?​

答: 常用手段:① 修改默认端口 22(Port),减少扫描;② 禁止 root 远程登录(PermitRootLogin no);③ 关闭密码认证、改用密钥登录(PasswordAuthentication no + PubkeyAuthentication yes);④ 用 AllowUsers/AllowGroups 限制可登录用户;⑤ 配合防火墙/ fail2ban 限制来源。核心思想是缩小暴露面 + 用更强的认证方式。

9. Ansible 为什么不需要在被管理机器安装客户端?它通信依靠什么?ad-hoc 和 playbook 分别适合什么场景?​

答: Ansible 是无 agent 架构,通信完全基于 SSH:控制节点通过 SSH 连到被控机执行临时生成的命令/模块代码,执行完即清理,所以被控端零安装。ad-hoc 是单条命令的批量执行(如 ansible web -m shell -a "df -h"),适合临时、一次性操作;playbook 是 YAML 编写的任务剧本(幂等、可版本化、可复用),适合标准化、可重复的场景,如批量装软件、推配置、建用户、定时备份。

10. Zabbix 和 Prometheus 监控架构上最大区别是什么?分别适合什么环境?​

答: 最大区别是采集模型:Zabbix 是推送模型,Agent 在被控机上采集并主动上报给 Server(Server 端口 10051,Agent 10050),数据存 MySQL;Prometheus 是拉取模型,Server 主动到各 exporter 的 /metrics 端点抓取,数据存时序数据库。Zabbix 配置项丰富、适合传统主机与中小型集群;Prometheus 拉取模型配合 Grafana、Alertmanager,与容器/Kubernetes 云原生生态天然契合,适合动态伸缩的云环境。

11. crontab 定时任务手动执行脚本正常,定时跑失败,最常见原因是什么?​

答: 最常见原因是环境变量差异:cron 的 PATH 环境变量非常精简(通常只有 /usr/bin:/bin 等),手动 Shell 里能找到的命令,cron 下找不到;其次是相对路径问题(cron 工作目录是用户家目录,脚本内用相对路径会找不到文件)。解决办法:脚本内命令写绝对路径,或脚本开头显式 source /etc/profile 并把 PATH 写全,文件也用绝对路径。另外要确认脚本有可执行权限、cron 时间字段写对了。

12. 磁盘 df 显示空间满了,但是找不到大文件,是什么原因?​

答: 两个经典原因:① 文件被进程占用(已删除但未释放)——进程仍持有已删除文件的文件描述符,磁盘块不会释放,du 找不到但 df 统计在内;用 lsof | grep deleted 确认,重启对应进程即可释放。② 海量小文件耗尽 inode——空间没满但 inode 用尽,同样无法创建新文件;用 df -i 查看 inode 使用率,找出小文件过多的目录清理。

本篇速记​

  • 排查万能链路:网络连通 → 端口监听 → 服务状态 → 配置语法 → 防火墙 → 日志。
  • 磁盘满找不到大文件 = deleted 文件未释放 或 inode 耗尽。
  • cron 失败首查 PATH 与绝对路径。
  • 内存看 available;OOM 会杀大进程,记录在 dmesg。