跳转至

1 典型Linux面试题 2026

DevOps Interview – Linux & Command Line Preparation

1. File & Directory Management

ls 列出文件和目录。

ls
ls -l
ls -la
ls -lh
ls -lt

How do you find the 10 most recently modified files?

ls -lt | head

cp 复制文件或目录。

cp file.txt /tmp/
cp file.txt backup.txt
cp -r directory /tmp/
cp -p file.txt backup.txt
  • -r → recursive
  • -p → preserve permissions/timestamps

2. File Content & Searching

head

head file.txt
head -n 20 file.txt

tail

tail file.txt
tail -n 100 app.log
tail -f app.log

How do you monitor a log file in real time?

tail -F /var/log/app.log

tail -f /var/log/app.log

grep

grep "ERROR" app.log

grep -i "error" app.log
grep -n "error" app.log
grep -r "error" /var/log/
grep -v "INFO" app.log
参数 含义
-i ignore case
-n line number
-r recursive
-v exclude/match inverse
-E extended regex

grep -i "error" app.log | tail -50

find

find /var/log -name "*.log"

# 按类型:
find /home -type f
find /home -type d


# 按大小:
find /var/log -type f -size +100M

# 删除:
find /tmp -name "*.tmp" -delete

find /tmp -name "*.tmp" -print
先确认,再删除。

4. Permissions

umask 这是你原资料中需要修正的地方

sudo chown user file.txt
sudo chown user:group file.txt
sudo chown -R user:group /opt/app

umask: 这是你原资料中需要修正的地方。

umask 022

top # 实时显示系统运行信息(CPU、内存、进程)

实时查看:

  • CPU
  • memory
  • processes
  • load
htop            # top 的增强版(需安装)
free -h         # 查看内存使用情况
df -h           # 查看磁盘使用率
du -sh *        # 当前目录下每个文件夹占用空间
vmstat 1 5      # 显示虚拟内存使用情况
iostat -x 1     # I/O 负载(需安装 sysstat)
uptime          # 查看系统运行时长和平均负载

The server is very slow. How do you troubleshoot?

应该形成一个 troubleshooting flow:

Server Slow
     │
     ├── CPU?
     │
     ├── Memory?
     │
     ├── Disk?
     │
     ├── I/O?
     │
     ├── Network?
     │
     └── Application?

CPU

top 或者 uptime

查看 load average:

load average: 2.1, 1.8, 1.5

一般对应:

1 min
5 min
15 min

Memory

free -h

重点关注:

  • total
  • used
  • free
  • available
  • swap

Disk df -h

查看 filesystem 使用率。

例如: /dev/sda1 100G 98G 2G 98%

哪个目录占空间?

du -sh /*

进一步:

du -sh /var/*

更方便:

ncdu /
Disk I/O
iostat -xz 1

Network Troubleshooting Interview Flow

Application cannot connect to another service. How do you troubleshoot?

1. DNS
   ↓
dig service.example.com

2. Network connectivity
   ↓
ping service.example.com

3. Port connectivity
   ↓
nc -zv service.example.com 443

4. HTTP layer
   ↓
curl -v https://service.example.com

5. Local listening port
   ↓
ss -lntp

6. Firewall
   ↓
iptables / nftables / cloud NSG

7. Application logs
   ↓
journalctl / application logs

Logs

journalctl

systemd 系统非常重要。 journalctl

某个 service: journalctl -u nginx

最近日志: journalctl -u nginx --since "1 hour ago"

实时: journalctl -u nginx -f

File Transfer

scp

scp file.txt user@server:/tmp/

从远程复制:

scp user@server:/tmp/file.txt .

rsync

rsync -avz source/ user@server:/destination/


rsync -avz --delete source/ destination/

Archive

创建: tar -cvf archive.tar directory/

创建: tar -czvf archive.tar.gz directory/

解压: tar -xzvf archive.tar.gz

查看: tar -tzvf archive.tar.gz


c = create
x = extract
t = list
v = verbose
f = file
z = gzip

Text Processing

awk awk '{print $1}' file.txt

ps aux | awk '{print $1,$2,$11}'

sed 替换:

sed 's/old/new/g' file.txt

直接修改:

sed -i 's/old/new/g' file.txt

sort

sort file.txt
sort -n numbers.txt
sort -r file.txt

uniq

sort file.txt | uniq

统计: sort file.txt | uniq -c

wc

wc -l file.txt

统计行数。

cut

cut -d',' -f1 file.csv

xargs

find . -name "*.log" | xargs rm

生产环境更安全的方式:

find . -name "*.log" -print0 | xargs -0 rm

find . -name "*.log" -delete
  1. Cron

编辑: crontab -e

例如:

0 2 * * * /opt/scripts/backup.sh

意思:

02:00 every day

Cron 五个字段:

  • minute
  • hour
  • day of month
  • month
  • day of week

记忆:

* * * * *
│ │ │ │ │
│ │ │ │ └── day of week
│ │ │ └──── month
│ │ └────── day
│ └──────── hour
└────────── minute

Git

Working Directory
       ↓
git add
       ↓
Staging Area
       ↓
git commit
       ↓
Local Repository
       ↓
git push
       ↓
Remote Repository

You have uncommitted changes but need to switch branches.

git stash
git checkout other-branch

Kubernetes

kubectl get pod
       ↓
kubectl describe pod
       ↓
kubectl logs
       ↓
kubectl logs --previous
       ↓
kubectl exec
       ↓
kubectl get events
       ↓
Check Service
       ↓
Check Endpoints
       ↓
Check DNS
       ↓
Check NetworkPolicy

Kubernetes Troubleshooting Cheat Sheet

CrashLoopBackOff

kubectl logs pod
kubectl logs pod --previous
kubectl describe pod pod

重点检查:

  • application crash
  • wrong command
  • environment variables
  • secrets
  • config
  • liveness probe
  • readiness probe
  • resource limits

ImagePullBackOff

kubectl describe pod pod

检查:

  • image name
  • image tag
  • registry
  • credentials
  • imagePullSecrets

Pending

kubectl describe pod pod

检查:

  • CPU/memory
  • node availability
  • taints/tolerations
  • nodeSelector
  • affinity
  • PVC

Service 无法访问

kubectl get svc
kubectl get endpoints
kubectl describe svc <service>
kubectl get pods --show-labels

重点检查:

Service selector
       ↓
Pod labels
       ↓
Endpoints

Performance Tools

top
free -h
df -h
du -sh
vmstat
iostat
sar
CPU       → top
Memory    → free
Disk      → df / du
Disk I/O  → iostat
System    → vmstat
Historical→ sar

面试官目的:排查端口冲突或服务是否成功启动。

netstat -tulnp | grep :端口号
ss -tulnp | grep :端口号  # 推荐使用,效率更高
lsof -i:端口号            # 查看具体哪个程序占用端口

3 如何给文件添加执行权限?

chmod +x script.sh         # 添加执行权限
chmod 755 script.sh        # rwxr-xr-x:常用于可执行脚本
ls -l                      # 查看权限

# chown命令修改属主属组
chown liyb.liyb script.sh  # 将脚本属主和属组修改为liyb

# -R 参数可以将权限递归

4 如何查看某个进程的详细信息?

ps aux | grep 进程名           # 查找进程 PID 和状态

top -p PID                    # 查看指定 PID 的动态资源占用

cat /proc/PID/status          # 查看进程详细状态

lsof -p PID                   # 查看进程打开的文件

strace -p PID                 # 跟踪系统调用(排查卡顿)

5 软链接和硬链接的区别?

  • 软链接:类似 Windows 快捷方式,指向文件路径。
  • 硬链接:指向相同的 inode,不依赖文件名。

区别:

删除原文件:软链接失效,硬链接仍然可用。

跨分区:软链接可以,硬链接不行。

目录:通常不允许创建硬链接

ln -s source.txt softlink.txt     # 创建软链接
ln source.txt hardlink.txt        # 创建硬链接

6 Linux 系统负载高怎么办?

确认负载:

uptime     # 查看 load average(过去1、5、15分钟)

top        # 查看 CPU、内存占用进程

查看 I/O 压力:

iostat -x 1

iotop              # 实时查看 I/O 重的进程

内存检查:

free -m

vmstat 1 5

日志检查:

dmesg | tail       # 内核错误信息

journalctl -xe     # 查看最近系统错误

高级工具:

strace、perf top、sar 等用于深入性能分析

8 如何查看和分析系统日志?

日志位置:

/var/log/messages      # 系统日志(传统 Linux)
/var/log/syslog        # Debian 系
/var/log/dmesg         # 启动硬件日志

journalctl  -xe             # systemd 日志查看器

有些是应用日志,需要根据实际的配置路径来查看,查看日志时一般使用tail -f 来持续查看日志输出

9 Linux 如何设置定时任务?

crontab -e           # 编辑当前用户的定时任务

crontab -l           # 查看当前任务

语法结构:

* * * * * command_to_run
分 时 日 月 星期 要执行的命令

示例:每天凌晨 3 点执行备份脚本

0 3 * * * /home/user/backup.sh

10 如何查找文件或内容?

find /path -name "*.log"           # 按名称查找
find / -type f -size +100M         # 查找大文件

查找文件内容:

grep "关键词" 文件名
grep -r "关键词" ./               # 递归查找
find . -type f | xargs grep "关键词"

12个grep命令行组合

分享一下grep常用组合。在 Linux/Unix 的日常运维、开发调试、日志分析中,grep 是几乎人手必备的工具。

1 最简单查找

grep "ERROR" /var/log/messages

这是精确查找方式,查找日志里所有包含 ERROR 的行。

2 忽略大小写

grep -i "error" /var/log/messages

这是模糊查找方式,-i参数可以忽略大小写。无论 error、Error、ERROR 都能搜到。

3 显示行号 + 高亮

grep -ni --color=auto "ERROR" /data/tomcat/logs/catalina.out

-n带行号输出、带高亮,快速定位问题行。

Alt Image Text

4 统计关键字出现次数

grep -c "ERROR" /var/log/messages

输出匹配总次数,而不是具体内容。

5 排除干扰信息

grep "ERROR" /var/log/messages | grep -v "DEBUG"

先匹配 ERROR,再过滤掉 DEBUG 行。 在复杂日志里很常用。

6 多关键字组合

grep -E "ERROR|WARN" /var/log/messages

同时查找 ERROR 或 WARN。

7 抽取关键部分

grep -o "ERROR.*"  /data/tomcat/logs/catalina.out

只输出匹配片段,比如提取 ERROR 开头的报错内容。

Alt Image Text

8 搜索整个目录

grep -ir "https://www.liyb.com" ./logs

-r 参数是遍历当前目录及目录下所有文件,在代码目录里递归搜索 https://www.liyb.com 标记。

9 限定文件类型

grep -ir --include="*.log" "Logger" ./logs

只搜 .log 文件,避免无关文件干扰。

10 查看上下文

grep -C 3 "ERROR" catalina.out

匹配结果前后各显示 3 行上下文。 组合:

  • -A N 只看后面 N 行
  • -B N 只看前面 N 行

11. 实时过滤日志

tail -f catalina.out | grep "ERROR"

生产环境实时盯报错。 组合增强版:

tail -f catalina.out | grep -E "ERROR|WARN" | grep -v "DEBUG"

实时只看 ERROR/WARN,过滤掉 DEBUG,清爽很多。

12. 结合 find 精确搜索

find ./ -name "*.log" | xargs grep "OutOfMemory"

在所有 .log 文件里查找 OutOfMemory 报错。

3 curl和wget的正确使用姿势

1 区别:定位不同

wget:专注于下载,curl:专注于数据传输

简单来说,如果你想下载文件,用wget;如果你想调试API、传输复杂数据,用curl。

2 wget:专业的下载工具

2.1 核心用途

  • 递归下载整个网站
  • 断点续传大文件
  • 批量下载资源

2.2 常用操作

# 基本下载,后面直接加URL
wget https://packages.gitlab.com/gitlab/gitlab-ce/packages/ol/9/gitlab-ce-18.2.8-ce.0.el9.x86_64.rpm

# -c: 断点续传(生产环境必备!)
wget -c https://packages.gitlab.com/gitlab/gitlab-ce/packages/ol/9/gitlab-ce-18.2.8-ce.0.el9.x86_64.rpm

# -b:后台下载
wget -b https://packages.gitlab.com/gitlab/gitlab-ce/packages/ol/9/gitlab-ce-18.2.8-ce.0.el9.x86_64.rpm

# 限速下载(避免影响业务)
wget --limit-rate=200k https://packages.gitlab.com/gitlab/gitlab-ce/packages/ol/9/gitlab-ce-18.2.8-ce.0.el9.x86_64.rpm

# -r:递归下载整个目录
wget -r -np -nH https://baidu.com/files/

# 下载并重命名
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

# 指定重试次数
wget -t 5 https://baidu.com/unstable-file.zip

# 超时设置
wget -T 30 https://baidu.com/slow-file.zip

Alt Image Text

3 curl:强大的数据传输工具

3.1 核心用途

  • API调试和测试
  • 复杂HTTP请求
  • 文件上传
  • 协议支持广泛(支持20+种协议)

3.2 常用操作

# 基本请求
curl curl https://ligelinux.com

# 显示详细请求信息(调试神器)
curl -v  https://ligelinux.com/console

# 只显示响应头
curl -I https://ligelinux.com/console

# 指定请求方法
curl -X POST https://ligelinux.com/console
curl -X GET https://ligelinux.com/console


# 发送JSON数据
curl -X POST \
     -H "Content-Type: application/json" \
     -d '{"name":"张三","email":"zhangsan@example.com"}' \
     https://baidu.com/users

# 输出到文件
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

# 跟随重定向
curl -L https://ligelinux.com/console

Alt Image Text

4 关键区别总结

特性 wget curl
主要定位 下载工具 数据传输工具
协议支持 HTTP, HTTPS, FTP 20+种协议
递归下载 原生支持 不支持
断点续传 原生支持 需要特定参数
API调试 有限 非常强大
输出默认 保存到文件 输出到stdout

5 常见误区纠正

误区1:curl不能下载文件

错误:很多人认为curl只能查看内容不能下载

正确:curl也能下载

# curl也可以下载文件
curl -O  https://mirrors.aliyun.com/repo/Centos-7.repo         # 保持原文件名
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
  # 自定义文件名

Alt Image Text

误区2:wget可以很好地进行API调试

错误:用wget测试复杂API

正确:wget适合简单下载,复杂API应该用curl

误区3:两者可以完全互换

错误:认为curl和wget功能相同

正确:各有专长,根据场景选择

总之记住这个简单的原则:下载用wget,调试用curl。

4 Vim

yum install -y vim

Alt Image Text

1、普通模式

默认的编辑模式。从 shell 窗口打开文件进入的第一个模式,其他模式可以通过按 ESC 键回退到普通模式。

2、命令模式

用于执行复杂查询命令,从普通模式输入“:”,“/”或“?”等符号即可进入命令模式,回车键表示输入完成

3、插入模式

该模式就类似 window 中操作文本文件,普通模式下可通过输入“i”,“o”等字符即可进入插入模式。编辑完成后按 ESC 键退出到普通模式

4、可视模式

用于选定文本块;可以在正常模式下输入“v”(小写)来按字符选定,输入“V”(大写)来按行选定,或输入“Ctrl-V”来按方块选定。

三、每个模式的常用操作

1、vim 打开文件方法

  • vim filename 正常打开vim文件
  • vim + filename 打开文件,并将光标置于最后一行
  • vim +n filename 打开文件,并将光标置于第n行
  • vim +/ssh passwd 打开文件,并将光标置于第一个与ssh匹配的位置
  • vim -r filename 恢复上次vim打开时崩溃的文件

2、普通模式

  • G 跳到最后一行
  • gg 跳到第一行
  • 5G 跳到第5行
  • yy 复制当前行
  • 5yy 复制从当前行往后的5行
  • p 粘贴已复制的行到光标后
  • P 粘贴已复制的行到光标前
  • dd (1)剪切当前行,以p粘贴;(2)删除当前行
  • 5dd 删除5行
  • dG 从当前行删到最后一行
  • D 从光标处删除到行尾
  • 5dG 从当前行删到第五行
  • x 删除光标所在位置的字符
  • 5x 删除光标所在位置的字符及往后的5个字符
  • X 删除光标所在位置的前一个字符
  • u 撤销之前的操作
  • Ctrl + r 反撤销(恢复撤销)
  • 数字0或者^ 将光标移动到当前行的行首
  • $ 将光标移动到当前行的行尾
  • ctrl +f 向下翻页
  • ctrl +b 向上翻页
  • N 查找下一个相同的字符
  • N 查找上一个相同的字符
  • r替换光标所在位置的字符
  • R 从光标当前位置开始替换字符,输入内容会覆盖后面等长的内容,按“Esc”结束输入
  • h向左移动光标
  • j向下移动光标
  • k向上移动光标
  • l向右移动光标

3、命令模式常用命令

  • :wq 保存退出
  • :wq! 强制保存退出
  • :q 不保存退出
  • :q! 强制退出,一般已经对文件内容已经进行了修改,不保存强制退出的情况使用
  • :set nu 设置行号显示
  • :set nonu 取消行号
  • :set list 取消行号
  • set paste 启用粘贴模式
  • set nopaste 关闭粘贴模式
  • :s/a/b/g 将当前光标所在行中所有a替换成b
  • :2,5s/a/b/g 将2-5行中所有a替换成b
  • :%s/a/b/g 将文件所有的a替换成b
  • /word 从文本查找字符串,按“n”可以查看下一个相同字符 .注意:查找会区分大小写
  • /^word 查询以work开头的行
  • /work$ 查询以work结尾
  • ?work 从文本查找字符串,按“n”可以查看上一个相同字符

4、进入插入模式方法

  • i光标所在位置插入
  • I光标所在位置行首插入
  • o光标所在位置下一行插入
  • O光标所在位置上一行插入
  • a光标所在位置下一个字符的位置插入
  • A光标所在位置行尾插

进入到插入模式后就如同进入一个文档文件,按ESC键退出到普通模式

5、可视化模式常用操作

  • v 字符选择模式,选中光标经过的所有字符
  • V 行选择模式,选择光标经过的所有行