Linux系统管理核心知识点详解

目录


常用命令详解

1. grep命令 - 文本搜索利器

基本语法

1
grep [选项] 模式 [文件]

常用参数

  • -i:忽略大小写
  • -v:反向匹配
  • -n:显示行号
  • -r:递归搜索
  • -E:使用扩展正则表达式
  • -A:显示匹配行后N行
  • -B:显示匹配行前N行

实战技巧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 搜索包含error的日志行
grep -i "error" /var/log/syslog

# 搜索不包含debug的日志行
grep -v "debug" application.log

# 使用正则表达式匹配IP地址
grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" access.log

# 搜索Java进程并排除grep自身
ps aux | grep java | grep -v grep

# 搜索多个关键词
grep -E "(error|exception|fatal)" app.log

高级正则表达式应用

1
2
3
4
5
6
7
8
# 匹配邮箱地址
grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"

# 匹配手机号码
grep -E "1[3-9][0-9]{9}"

# 匹配URL
grep -E "https?://[^[:space:]]+"

2. find命令 - 文件查找专家

基本语法

1
find [路径] [表达式]

常用参数

  • -name:按文件名查找
  • -type:按文件类型查找
  • -mtime:按修改时间查找
  • -size:按文件大小查找
  • -perm:按权限查找
  • -user:按用户查找

实战技巧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查找7天内修改的.log文件
find /var/log -name "*.log" -mtime -7

# 查找大于100MB的文件
find / -type f -size +100M

# 查找空文件并删除
find /tmp -type f -empty -delete

# 查找权限为777的文件
find /home -type f -perm 777

# 查找并批量修改权限
find /app -type f -name "*.sh" -exec chmod +x {} \;

# 按时间范围查找
find /data -type f -newermt "2024-01-01" ! -newermt "2024-12-31"

复杂查找组合

1
2
3
4
5
6
7
8
# 查找最近7天内修改的Java文件
find . -name "*.java" -mtime -7 -type f

# 查找大于10MB小于100MB的文件
find /var -size +10M -size -100M -type f

# 查找并压缩7天前的日志
find /var/log -name "*.log" -mtime +7 -exec gzip {} \;

3. awk命令 - 文本处理神器

基本语法

1
awk 'pattern {action}' file

内置变量

  • $0:整行内容
  • $1-$n:第1-n个字段
  • NF:字段数量
  • NR:行号
  • FS:字段分隔符
  • OFS:输出字段分隔符

实战技巧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 打印第1列和第3列
awk '{print $1, $3}' access.log

# 按条件过滤并统计
awk '$9 == 200 {count++} END {print count}' access.log

# 计算平均响应时间
awk '{sum+=$10} END {print "Average:", sum/NR}' access.log

# 按状态码统计
awk '{status[$9]++} END {for(s in status) print s, status[s]}' access.log

# 处理CSV文件
awk -F',' '{print $1, $3}' data.csv

高级应用

1
2
3
4
5
6
7
8
# 统计每个IP的访问次数
awk '{ip[$1]++} END {for(i in ip) print i, ip[i]}' access.log | sort -k2 -nr

# 找出访问最多的10个URL
awk '{url[$7]++} END {for(u in url) print url[u], u}' access.log | sort -nr | head -10

# 计算某时间段内的访问量
awk '$4 >= "[10/Oct/2024:09:00:00" && $4 <= "[10/Oct/2024:18:00:00" {count++} END {print count}' access.log

4. top命令 - 系统监控工具

界面解读

1
2
3
4
5
top - 15:30:45 up 2 days,  3:15,  2 users,  load average: 0.12, 0.08, 0.05
Tasks: 225 total, 1 running, 224 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.2 us, 0.5 sy, 0.0 ni, 98.0 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 8167848 total, 1234568 free, 2345678 used, 4587602 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 5432168 avail Mem

关键指标解释

  • load average:系统负载(1分钟、5分钟、15分钟平均值)
  • %Cpu(s):CPU使用率
    • us:用户空间占用
    • sy:内核空间占用
    • id:空闲CPU百分比
    • wa:等待I/O的CPU时间
  • KiB Mem:内存使用情况
  • KiB Swap:交换空间使用情况

交互命令

  • P:按CPU使用率排序
  • M:按内存使用率排序
  • T:按运行时间排序
  • k:终止进程
  • r:修改进程优先级
  • 1:显示每个CPU核心的使用情况

实战技巧

1
2
3
4
5
6
7
8
9
10
11
# 显示特定用户的进程
top -u username

# 以批处理模式运行
top -b -n 1 > top_output.txt

# 按内存排序
top -o %MEM

# 显示完整命令行
top -c

系统监控与性能分析

1. CPU性能分析

使用top/htop监控CPU

1
2
3
4
5
6
# 安装htop(更友好的top替代品)
sudo apt install htop # Ubuntu/Debian
sudo yum install htop # CentOS/RHEL

# 使用htop
htop

CPU使用率分析

1
2
3
4
5
6
7
8
# 查看CPU详细信息
cat /proc/cpuinfo

# 查看CPU使用率统计
sar -u 1 5

# 查看每个CPU核心的使用率
mpstat -P ALL 1 5

高CPU占用排查步骤

  1. 使用top找出高CPU进程

    1
    top -o %CPU
  2. 查看进程详细信息

    1
    ps -p PID -o pid,ppid,cmd,%mem,%cpu
  3. 分析进程线程

    1
    2
    top -H -p PID
    ps -T -p PID
  4. 使用strace跟踪系统调用

    1
    sudo strace -p PID

2. 内存性能分析

内存使用情况

1
2
3
4
5
6
7
8
# 查看内存使用情况
free -h

# 查看内存详细信息
cat /proc/meminfo

# 查看进程内存使用
ps aux --sort=-%mem | head -20

内存泄漏检测

1
2
3
4
5
6
7
8
# 使用valgrind检测内存泄漏
valgrind --tool=memcheck --leak-check=full ./your_program

# 使用pmap查看进程内存映射
pmap -x PID

# 使用smem查看内存使用情况
smem -r

内存优化建议

  1. 调整swappiness参数

    1
    2
    3
    4
    5
    6
    7
    8
    # 查看当前值
    cat /proc/sys/vm/swappiness

    # 临时修改(重启失效)
    sudo sysctl vm.swappiness=10

    # 永久修改
    echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
  2. 清理缓存

    1
    2
    3
    4
    5
    6
    7
    8
    # 清理页缓存
    sudo sync && echo 1 > /proc/sys/vm/drop_caches

    # 清理目录项和inode缓存
    sudo sync && echo 2 > /proc/sys/vm/drop_caches

    # 清理所有缓存
    sudo sync && echo 3 > /proc/sys/vm/drop_caches

3. 磁盘I/O性能分析

磁盘使用情况

1
2
3
4
5
6
7
8
9
10
11
# 查看磁盘使用情况
df -h

# 查看目录大小
du -sh /path/to/directory

# 查看磁盘I/O统计
iostat -x 1 5

# 查看实时I/O
iotop -o

I/O性能优化

1
2
3
4
5
6
7
8
# 查看磁盘调度算法
cat /sys/block/sda/queue/scheduler

# 修改磁盘调度算法(临时)
echo deadline > /sys/block/sda/queue/scheduler

# 使用fio测试磁盘性能
fio --name=randread --ioengine=libaio --rw=randread --bs=4k --direct=1 --size=1G --numjobs=4 --runtime=60 --group_reporting

故障排查与诊断

1. 系统日志分析

重要日志文件位置

  • /var/log/syslog:系统日志(Ubuntu/Debian)
  • /var/log/messages:系统日志(CentOS/RHEL)
  • /var/log/auth.log:认证日志
  • /var/log/kern.log:内核日志
  • /var/log/dmesg:系统启动信息

日志分析技巧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看系统错误日志
journalctl -p err -b

# 查看特定服务的日志
journalctl -u nginx.service

# 查看最近100行日志
tail -100 /var/log/syslog

# 实时监控日志
tail -f /var/log/nginx/error.log

# 按时间范围查看日志
journalctl --since "2024-01-01" --until "2024-01-31"

2. OOM(内存溢出)场景分析

OOM Killer机制

当系统内存不足时,Linux的OOM Killer会选择并终止占用内存最多的进程。

OOM排查步骤

  1. 检查OOM日志

    1
    2
    grep -i "killed process" /var/log/syslog
    dmesg | grep -i "oom"
  2. 分析OOM分数

    1
    2
    3
    4
    5
    # 查看进程OOM分数
    cat /proc/PID/oom_score

    # 查看OOM调整值
    cat /proc/PID/oom_score_adj
  3. 配置OOM保护

    1
    2
    # 保护重要进程(-1000表示禁止OOM killer)
    echo -1000 > /proc/PID/oom_score_adj

OOM预防策略

  • 合理配置JVM堆内存
  • 使用内存监控工具
  • 配置swap空间
  • 优化应用程序内存使用

3. 系统无响应排查

排查步骤

  1. 检查系统负载

    1
    2
    uptime
    cat /proc/loadavg
  2. 检查进程状态

    1
    ps aux | grep -E "(D|Z)"
  3. 检查I/O等待

    1
    iostat -x 1 5
  4. 检查网络连接

    1
    netstat -tuln | grep -E "(CLOSE_WAIT|TIME_WAIT)"

服务管理与配置

1. systemctl命令详解

基本服务管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 启动服务
sudo systemctl start nginx

# 停止服务
sudo systemctl stop nginx

# 重启服务
sudo systemctl restart nginx

# 重新加载配置
sudo systemctl reload nginx

# 查看服务状态
sudo systemctl status nginx

# 设置开机启动
sudo systemctl enable nginx

# 禁用开机启动
sudo systemctl disable nginx

服务状态监控

1
2
3
4
5
6
7
8
9
10
11
# 查看所有运行中的服务
systemctl list-units --type=service --state=running

# 查看服务日志
journalctl -u nginx.service -f

# 查看服务依赖关系
systemctl list-dependencies nginx

# 检查服务配置
sudo nginx -t

2. 服务故障排查

服务启动失败排查

  1. 检查服务状态

    1
    sudo systemctl status service_name
  2. 查看详细日志

    1
    journalctl -u service_name --no-pager -l
  3. 检查配置文件

    1
    2
    3
    4
    # 不同服务的配置文件检查
    sudo nginx -t # Nginx
    sudo apache2ctl -t # Apache
    sudo php-fpm -t # PHP-FPM
  4. 检查端口占用

    1
    2
    netstat -tulnp | grep :80
    ss -tulnp | grep :80

服务性能监控

1
2
3
4
5
6
7
8
# 使用systemd-cgtop监控资源使用
systemd-cgtop

# 查看服务资源限制
systemctl show service_name --property=MemoryMax,CPUQuotaPerSecUSec

# 设置服务资源限制
sudo systemctl set-property service_name MemoryMax=1G CPUQuota=50%

网络诊断与优化

1. 网络连接状态分析

netstat命令详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看所有网络连接
netstat -tuln

# 查看TCP连接
netstat -tlnp

# 查看监听端口
netstat -lntp

# 查看网络统计信息
netstat -s

# 查看路由表
netstat -rn

ss命令(netstat替代品)

1
2
3
4
5
6
7
8
9
10
11
# 查看所有连接
ss -tuln

# 查看TCP连接状态统计
ss -s

# 查看监听端口
ss -lntp

# 查看进程使用的端口
ss -pl

网络连接状态解释

  • ESTABLISHED:已建立的连接
  • LISTEN:监听状态
  • TIME_WAIT:连接关闭后等待
  • CLOSE_WAIT:等待本地应用关闭
  • SYN_SENT/SYN_RECV:TCP握手过程

2. 网络性能优化

网络带宽监控

1
2
3
4
5
6
7
8
9
10
11
# 使用iftop监控实时流量
sudo apt install iftop
sudo iftop -i eth0

# 使用nload查看网络流量
sudo apt install nload
sudo nload

# 使用vnstat统计网络流量
sudo apt install vnstat
sudo vnstat -i eth0

TCP性能调优

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看当前TCP参数
sysctl net.ipv4.tcp_congestion_control

# 修改TCP拥塞控制算法
sudo sysctl -w net.ipv4.tcp_congestion_control=bbr

# 优化TCP缓冲区
sudo sysctl -w net.core.rmem_max=16777216
sudo sysctl -w net.core.wmem_max=16777216

# 查看网络接口配置
ethtool -i eth0
ethtool -S eth0

网络故障排查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 测试网络连通性
ping -c 4 google.com

# 路由跟踪
mtr google.com
traceroute google.com

# DNS解析测试
nslookup google.com
dig google.com

# 端口连通性测试
telnet hostname 80
nc -zv hostname 80

实战案例分析

案例1:Web服务器高负载排查

问题描述

Web服务器响应缓慢,CPU使用率接近100%。

排查过程

  1. 查看系统负载

    1
    2
    uptime
    top -o %CPU
  2. 发现异常进程

    1
    ps aux | grep -E "(apache|nginx)"
  3. 分析访问日志

    1
    2
    3
    4
    5
    # 统计IP访问次数
    awk '{ip[$1]++} END {for(i in ip) print ip[i], i}' access.log | sort -nr | head -10

    # 检查是否有异常User-Agent
    awk -F'"' '{ua[$6]++} END {for(u in ua) print ua[u], u}' access.log | sort -nr | head -10
  4. 解决方案

    • 配置防火墙限制IP访问频率
    • 优化Web服务器配置
    • 启用CDN减轻服务器压力

案例2:内存泄漏排查

问题描述

Java应用内存持续增长,最终导致OOM。

排查过程

  1. 监控内存使用

    1
    2
    top -p JAVA_PID
    jstat -gc JAVA_PID 1s
  2. 生成堆转储

    1
    jmap -dump:format=b,file=heap.hprof JAVA_PID
  3. 使用MAT分析

    • 导入heap.hprof文件
    • 查找内存泄漏嫌疑对象
    • 分析引用链
  4. 优化代码

    • 修复资源未关闭问题
    • 优化缓存策略
    • 增加内存监控告警

案例3:网络连接数过多

问题描述

服务器网络连接数达到上限,新连接被拒绝。

排查过程

  1. 查看连接状态

    1
    netstat -an | awk '/^tcp/ {state[$NF]++} END {for(key in state) print key, state[key]}'
  2. 发现大量TIME_WAIT

    1
    netstat -an | grep TIME_WAIT | wc -l
  3. 优化内核参数

    1
    2
    3
    4
    5
    6
    7
    8
    # 减少TIME_WAIT时间
    sudo sysctl -w net.ipv4.tcp_fin_timeout=30

    # 启用TIME_WAIT重用
    sudo sysctl -w net.ipv4.tcp_tw_reuse=1

    # 启用TIME_WAIT快速回收
    sudo sysctl -w net.ipv4.tcp_tw_recycle=1

高频面试题

1. grep命令相关

Q1:如何使用grep查找包含”error”但不包含”debug”的行?

1
grep "error" file.log | grep -v "debug"

Q2:如何在多个文件中递归查找包含特定字符串的文件?

1
grep -r "search_string" /path/to/directory

Q3:如何使用正则表达式匹配邮箱地址?

1
grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" file.txt

2. find命令相关

Q1:如何查找7天内修改过的文件?

1
find /path -type f -mtime -7

Q2:如何查找并删除大于100MB的文件?

1
find /path -type f -size +100M -delete

Q3:如何查找特定用户拥有的文件?

1
find /path -user username -type f

3. 系统监控相关

Q1:top命令中的load average是什么意思?

  • load average表示系统的平均负载,分别是1分钟、5分钟、15分钟的平均值
  • 理想情况下应该小于CPU核心数

Q2:如何排查CPU使用率过高的问题?

  1. 使用top命令找出高CPU进程
  2. 使用ps命令查看进程详细信息
  3. 使用strace跟踪系统调用
  4. 分析应用程序日志

Q3:如何检测内存泄漏?

  • 使用valgrind工具
  • 监控内存使用趋势
  • 分析堆转储文件
  • 检查资源是否正确释放

4. 故障排查相关

Q1:系统OOM Killer触发了,如何分析?

  1. 查看/var/log/syslog中的OOM日志
  2. 分析dmesg输出
  3. 检查进程的OOM分数
  4. 优化内存使用或增加内存

Q2:如何排查磁盘空间不足?

  1. 使用df -h查看磁盘使用情况
  2. 使用du -sh查找大文件
  3. 清理日志文件
  4. 删除不必要的文件

5. 网络诊断相关

Q1:如何查看端口是否被占用?

1
2
3
netstat -tulnp | grep :80
ss -tulnp | grep :80
lsof -i :80

Q2:如何分析大量TIME_WAIT连接?

  • 调整tcp_fin_timeout参数
  • 启用tcp_tw_reuse和tcp_tw_recycle
  • 优化应用程序连接管理

总结

Linux系统管理是一项综合性的技能,需要掌握:

  1. 命令熟练度:熟练使用grep、find、awk等常用命令
  2. 系统监控:能够使用各种工具监控CPU、内存、磁盘、网络等资源
  3. 故障排查:具备系统性的故障排查思路和方法
  4. 性能优化:能够根据实际情况进行系统调优
  5. 实践经验:通过实际案例积累经验,形成自己的知识体系

建议读者:

  • 多动手实践,在测试环境中验证各种命令和参数
  • 建立系统化的排查思路,遇到问题时能够快速定位
  • 关注系统日志,及时发现潜在问题
  • 定期备份重要数据,避免数据丢失
  • 持续学习新的工具和技术,跟上技术发展

参考资料

  1. Linux命令大全
  2. Linux Performance
  3. 系统性能调优指南
  4. Linux故障排查手册
  5. 网络诊断工具指南