Linux 运维实战:从 10 个高频面试题到 3 个自动化脚本(含网络诊断与日志分析)

📅 2026/7/6 21:48:56
Linux 运维实战:从 10 个高频面试题到 3 个自动化脚本(含网络诊断与日志分析)
Linux 运维实战从 10 个高频面试题到 3 个自动化脚本含网络诊断与日志分析1. 为什么需要自动化运维脚本在Linux运维工作中重复性任务占据了工程师大量时间。根据2023年Stack Overflow开发者调查显示62%的运维工程师每天花费超过2小时处理重复性任务。通过编写自动化脚本我们可以将平均故障恢复时间(MTTR)缩短70%减少人为操作失误导致的系统故障实现24小时无人值守监控标准化运维操作流程提示自动化脚本开发应遵循一次编写多次使用原则重点关注高频、高风险操作场景2. 网络连接诊断实战2.1 TCP连接状态分析#!/bin/bash # 实时监控TCP连接状态 watch -n 1 netstat -ant | awk \/^tcp/ {S[$NF]} END {for(a in S) print a, S[a]}\ # 输出示例 # ESTABLISHED 23 # TIME_WAIT 42 # SYN_SENT 1常见TCP状态解析状态含义典型问题ESTABLISHED已建立连接正常通信状态TIME_WAIT等待关闭短连接过多时堆积SYN_SENT连接请求已发送目标端口无响应CLOSE_WAIT被动关闭等待应用程序未正确关闭连接2.2 网络流量TopN分析# 统计访问量前10的IP tcpdump -i eth0 -tnn dst port 80 -c 1000 | \ awk -F. {print $1.$2.$3.$4} | \ sort | uniq -c | sort -nr | head -103. 日志分析自动化3.1 实时日志监控脚本#!/usr/bin/env python3 # 实时监控Nginx访问日志中的异常请求 import re from collections import defaultdict log_file /var/log/nginx/access.log pattern r(\d\.\d\.\d\.\d).*?(\w) ([^]).*?(\d{3}) def tail_f(file): with open(file) as f: f.seek(0, 2) # 跳到文件末尾 while True: line f.readline() if not line: continue yield line if __name__ __main__: status_codes defaultdict(int) for line in tail_f(log_file): match re.search(pattern, line) if match: ip, method, path, status match.groups() status_codes[status] 1 if status.startswith(4) or status.startswith(5): print(f[异常] {ip} {method} {path} - {status})3.2 日志切割与归档方案#!/bin/bash # 日志切割与压缩备份脚本 LOG_DIR/var/log/nginx DATE$(date %Y%m%d) ARCHIVE_DIR/backup/logs # 切割日志 mv ${LOG_DIR}/access.log ${LOG_DIR}/access_${DATE}.log nginx -s reopen # 压缩归档 tar czf ${ARCHIVE_DIR}/nginx_logs_${DATE}.tar.gz ${LOG_DIR}/access_${DATE}.log # 清理旧日志 find ${ARCHIVE_DIR} -name nginx_logs_*.tar.gz -mtime 30 -delete # 添加到crontab每天凌晨执行 # 0 0 * * * /path/to/logrotate.sh4. 性能监控与优化4.1 系统资源监控脚本#!/bin/bash # 实时系统资源监控面板 while true; do clear echo 系统资源监控 echo CPU负载: $(uptime | awk -Faverage: {print $2}) echo 内存使用: $(free -h | awk /Mem/{print $3/$2}) echo 磁盘空间: $(df -h / | awk NR2{print $4/$2}) echo TCP连接数: $(netstat -ant | wc -l) echo 进程数: $(ps -ef | wc -l) sleep 2 done4.2 性能瓶颈快速定位CPU瓶颈排查流程top查看CPU使用率高的进程pidstat -u 1 5监控进程CPU使用perf top分析热点函数strace -p PID跟踪系统调用内存瓶颈排查流程free -m查看内存使用概况vmstat 1观察内存交换情况pmap -x PID分析进程内存分布valgrind --toolmemcheck检测内存泄漏5. 安全加固自动化5.1 用户登录监控脚本#!/bin/bash # 异常登录监控脚本 LOG_FILE/var/log/secure ALERT_FILE/var/log/login_alerts.log WHITELIST(192.168.1.100 10.0.0.1) tail -n0 -F $LOG_FILE | while read LINE; do if echo $LINE | grep -q Failed password; then IP$(echo $LINE | grep -oE [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) if [[ ! ${WHITELIST[]} ~ ${IP} ]]; then echo $(date) - 异常登录尝试来自 $IP $ALERT_FILE # 可选自动封禁IP # iptables -A INPUT -s $IP -j DROP fi fi done5.2 系统安全基线检查#!/bin/bash # 基础安全配置检查 echo 安全配置检查 echo [1] 空密码账户检查: awk -F: ($2 ) {print $1} /etc/shadow echo [2] SSH配置检查: grep -E ^PermitRootLogin|^PasswordAuthentication /etc/ssh/sshd_config echo [3] 敏感文件权限检查: ls -l /etc/passwd /etc/shadow /etc/sudoers echo [4] 防火墙状态: iptables -L -n | grep -E DROP|REJECT echo [5] 最近登录记录: last -n 56. 排错决策树实践网络连接故障排查流程开始 │ ├─ 能否ping通目标IP? │ ├─ 否 → 检查网络硬件/路由 │ └─ 是 → │ ├─ 目标端口是否开放?(telnet/nmap) │ ├─ 否 → 检查服务状态/防火墙 │ └─ 是 → │ ├─ 服务日志是否有报错? │ ├─ 是 → 根据日志修复 │ └─ 否 → │ └─ 客户端抓包分析(tcpdump/wireshark)磁盘空间不足处理流程开始 │ ├─ 确认磁盘使用率(df -h) │ ├─ 查找大文件(find / -type f -size 100M) │ ├─ 检查日志文件增长(lsof | grep deleted) │ ├─ 分析目录大小(du -sh /* | sort -h) │ └─ 清理策略: ├─ 日志轮转(logrotate) ├─ 临时文件清理(/tmp) └─ 归档旧数据7. 进阶Python运维工具开发7.1 服务器批量管理工具import paramiko from concurrent.futures import ThreadPoolExecutor def execute_remote(host, command): ssh paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: ssh.connect(host, usernameadmin, key_filename/path/to/key.pem) stdin, stdout, stderr ssh.exec_command(command) output stdout.read().decode() error stderr.read().decode() return f{host}: {output}{error} finally: ssh.close() servers [server1, server2, server3] commands [ uptime, df -h, free -m ] with ThreadPoolExecutor(max_workers10) as executor: for server in servers: for cmd in commands: future executor.submit(execute_remote, server, cmd) print(future.result())7.2 配置管理自动化import yaml from jinja2 import Template def generate_config(template_file, vars_file, output_file): with open(vars_file) as f: variables yaml.safe_load(f) with open(template_file) as f: template Template(f.read()) config template.render(**variables) with open(output_file, w) as f: f.write(config) # 示例使用 generate_config( templates/nginx.conf.j2, vars/web_servers.yaml, /etc/nginx/nginx.conf )8. 容器化运维实践8.1 Docker容器监控脚本#!/bin/bash # 容器资源监控 echo 容器状态监控: docker stats --no-stream --format table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}} echo 异常容器检查: docker ps -a --filter statusexited --format table {{.ID}}\t{{.Names}}\t{{.Status}} echo 存储卷使用情况: docker system df -v8.2 Kubernetes常用诊断命令# 查看集群状态 kubectl get componentstatuses # 查看节点资源使用 kubectl top nodes # 查看Pod日志 kubectl logs -f pod-name # 进入Pod调试 kubectl exec -it pod-name -- /bin/bash # 查看服务端点 kubectl get endpoints service-name # 资源使用监控 kubectl get --raw /apis/metrics.k8s.io/v1beta1/nodes | jq .9. 性能调优黄金法则Linux系统调优参数推荐配置# /etc/sysctl.conf 优化配置 # 避免TCP TIME_WAIT状态堆积 net.ipv4.tcp_tw_reuse 1 net.ipv4.tcp_tw_recycle 1 # 增大文件描述符限制 fs.file-max 65535 # 内存过量使用策略 vm.overcommit_memory 1 vm.swappiness 10 # 网络缓冲区大小 net.core.rmem_max 16777216 net.core.wmem_max 16777216Nginx性能优化关键参数worker_processes auto; # 自动匹配CPU核心数 worker_connections 1024; # 每个worker最大连接数 # 高效文件传输 sendfile on; tcp_nopush on; tcp_nodelay on; # 连接超时设置 keepalive_timeout 65; keepalive_requests 1000; # Gzip压缩 gzip on; gzip_min_length 1k; gzip_comp_level 2;10. 持续集成与部署10.1 Git钩子自动化部署#!/bin/bash # post-receive Git钩子示例 while read oldrev newrev refname do branch$(git rev-parse --symbolic --abbrev-ref $refname) if [ main $branch ]; then # 部署到生产环境 git --work-tree/var/www/production \ --git-dir/path/to/repo.git checkout -f # 执行部署后任务 cd /var/www/production \ npm install --production \ systemctl restart myapp fi done10.2 Ansible自动化部署示例# deploy_web.yml - hosts: webservers become: yes tasks: - name: 确保Nginx已安装 apt: name: nginx state: latest update_cache: yes - name: 部署配置文件 template: src: templates/nginx.conf.j2 dest: /etc/nginx/nginx.conf notify: 重启Nginx - name: 部署网站文件 copy: src: ../web_files/ dest: /var/www/html/ handlers: - name: 重启Nginx service: name: nginx state: restarted