阶段2(下):运维专题 Docker/Nginx/Linux/CI-CD/Git 的课程、企业场景、面试题和可运行示例
This commit is contained in:
1 parent
5eb67c5d08
commit
b8010a74f3
42 files changed
+3533
-55
No files matched your search
@@ -0,0 +1,59 @@
|
||||
---
|
||||
id: devops.linux.interview
|
||||
title: Linux 面试题
|
||||
type: interview
|
||||
domain: devops
|
||||
stack: [linux]
|
||||
tags: [Linux, 命令, 排查, 面试]
|
||||
level: basic
|
||||
related: [devops.linux.commands, devops.linux.troubleshooting]
|
||||
week: [14, 16]
|
||||
---
|
||||
|
||||
# Linux 面试题
|
||||
|
||||
## 基础
|
||||
|
||||
### 【基础】怎么查看某个端口被哪个进程占用?
|
||||
|
||||
**参考答案**:`ss -lntp | grep 8080`(或旧命令 `netstat -lntp`、`lsof -i :8080`),输出里有进程名和 PID。没有 root 权限时可能看不到其他用户进程的信息。
|
||||
|
||||
### 【基础】怎么实时查看日志?怎么查找包含某个关键字的行?
|
||||
|
||||
**参考答案**:`tail -f app.log` 实时跟踪;`grep -n "ERROR" app.log` 查找并显示行号,`grep -C 5` 显示上下文,`grep -r` 递归目录;systemd 服务用 `journalctl -u 服务名 -f`。
|
||||
|
||||
### 【基础】`kill`、`kill -9`、`kill -15` 有什么区别?
|
||||
|
||||
**参考答案**:`kill` 默认发送 SIGTERM(15),进程可以捕获它做清理后退出;`kill -9` 发送 SIGKILL,不能被捕获,进程立即被杀死,来不及释放资源。应该先 SIGTERM,等待超时后再 SIGKILL。
|
||||
|
||||
### 【基础】软链接和硬链接的区别?
|
||||
|
||||
**参考答案**:硬链接是同一个 inode 的另一个文件名,删除原文件后硬链接仍能访问,不能跨文件系统、不能链接目录;软链接是一个单独的文件,内容是目标路径,原文件删除后软链接失效,可以跨文件系统、可以链接目录。部署中常用软链接切换版本(`current -> releases/v2`)。
|
||||
|
||||
## 进阶
|
||||
|
||||
### 【进阶】服务器负载很高,你怎么排查?
|
||||
|
||||
**参考答案**:`uptime` 看 load 和核数对比;`top` 看 CPU 的 `us`(用户态计算)、`sy`(内核态)、`wa`(IO 等待);`wa` 高查磁盘(`iostat -x`、`iotop`),`us` 高找占用最高的进程和线程(`top -H -p`),再用语言工具(Go pprof、py-spy)定位到函数;同时看内存是否在用 swap。
|
||||
|
||||
### 【进阶】TIME_WAIT 和 CLOSE_WAIT 过多分别说明什么?
|
||||
|
||||
**参考答案**:TIME_WAIT 出现在主动关闭连接的一方,大量出现通常是频繁创建短连接,应该复用连接(keep-alive、连接池)。CLOSE_WAIT 表示对方已关闭、本方还没关闭,大量出现基本是程序没有关闭连接(例如 Go 没有 `resp.Body.Close()`),属于代码 bug。
|
||||
|
||||
### 【进阶】磁盘满了怎么处理?
|
||||
|
||||
**参考答案**:`df -h` 确认哪个分区满,`df -i` 检查 inode 是否用尽(大量小文件);`du -sh /* | sort -h` 逐层找大目录;常见是日志、临时文件、Docker 镜像和容器日志。删除正在被进程写的文件不会释放空间,用 `lsof +L1` 查找,清空文件内容或重启进程。长期方案:logrotate、Docker 日志大小限制、磁盘使用率告警。
|
||||
|
||||
## 场景题
|
||||
|
||||
### 【场景题】Go 服务内存持续上涨,最后被系统杀掉,怎么定位?
|
||||
|
||||
**参考答案**:先在内核日志确认是 OOM(`journalctl -k | grep -i oom`);服务开启 pprof,在内存上涨过程中多次采集 heap,对比哪些对象在增长(`go tool pprof -inuse_space`、`-base` 对比);同时看 goroutine 数量是否持续增长(goroutine 泄漏也会占内存)。常见原因:无上限的缓存或 map、goroutine 阻塞泄漏、读取大文件 / 大响应到内存。修复后加内存告警和 `MemoryMax` 限制。
|
||||
|
||||
### 【场景题】用户反馈接口偶尔很慢,但你登录服务器时一切正常,怎么办?
|
||||
|
||||
**参考答案**:需要事后可查的数据:Nginx 日志记录 `$request_time` 和 `$upstream_response_time`,用 awk 找出慢请求的时间点和接口;应用日志带请求 ID 和每一步耗时;数据库开慢查询日志;看云监控在对应时间点的 CPU、IO、网络曲线。根据时间点关联定时任务、备份、其他服务的批处理。长期方案是接入指标监控和链路追踪。
|
||||
|
||||
### 【场景题】怎么把一个 Go 程序部署成开机自启、崩溃自动重启的服务?
|
||||
|
||||
**参考答案**:编写 systemd 单元文件:指定运行用户、工作目录、环境变量文件、`ExecStart`、`Restart=on-failure`、`RestartSec`、停止超时;`systemctl daemon-reload`、`enable --now`;日志用 `journalctl -u` 查看。程序本身要处理 SIGTERM 优雅退出。也可以用 Docker 的 `restart: unless-stopped` 实现类似效果。
|
||||
Reference in new issue
Block a user