【云原生学习】Linux网络知识操作精讲 + 实战踩坑

0 阅读4分钟

一、进程监控与自动重启脚本

1. 脚本源码

#!/bin/bash
# =============================================
# 脚本名称: process_monitor.sh
# 功能: 每隔5秒监控指定进程,若不存在则自动重启并记录日志
# 用法: ./process_monitor.sh <进程名> <启动命令>
# 示例: ./process_monitor.sh nginx "systemctl start nginx"
# =============================================# 日志文件路径
LOG_FILE="/var/log/process_monitor.log"# 函数:记录带时间戳的日志
log_message() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
​
# 函数:检查进程是否存在(使用 kill -0 检测)
# 参数: $1 - 进程名
# 返回: 0 表示进程存在,非0表示不存在
check_process() {
    local proc_name="$1"
    # 使用 pgrep 精确匹配进程名(避免误匹配子串)
    pgrep -x "$proc_name" > /dev/null 2>&1
    return $?
}
​
# 函数:获取进程 PID 和状态信息
# 参数: $1 - 进程名
get_process_info() {
    local proc_name="$1"
    local pid=$(pgrep -x "$proc_name" | head -1)
    if [[ -n "$pid" ]]; then
        # 从 /proc/<pid>/status 中提取状态
        local state=$(awk '/^State:/ {print $2}' "/proc/$pid/status" 2>/dev/null)
        echo "PID: $pid, State: ${state:-Unknown}"
    else
        echo "Process not found"
    fi
}
​
# 主监控循环
monitor_loop() {
    local proc_name="$1"
    local start_cmd="$2"
​
    while true; do
        if check_process "$proc_name"; then
            # 进程存在:输出 PID 和状态
            info=$(get_process_info "$proc_name")
            log_message "[INFO] Process '$proc_name' is running - $info"
        else
            # 进程不存在:尝试重启
            log_message "[WARN] Process '$proc_name' not running. Attempting restart..."
            eval "$start_cmd"
            sleep 2  # 给启动留出时间
            if check_process "$proc_name"; then
                info=$(get_process_info "$proc_name")
                log_message "[OK] Process '$proc_name' restarted successfully - $info"
            else
                log_message "[ERROR] Failed to restart process '$proc_name'."
            fi
        fi
        sleep 5
    done
}
​
# 脚本入口
if [[ $# -lt 2 ]]; then
    echo "Usage: $0 <process_name> <start_command>"
    echo "Example: $0 sshd 'systemctl start sshd'"
    exit 1
fi
​
monitor_loop "$1" "$2"

2. 脚本中进程管理相关命令解释

命令 / 用法作用与说明
ps aux列出系统中所有运行进程的详细信息,常用于人工排查或脚本中 grep 过滤特定进程。本脚本未直接使用,因 pgrep 更精确高效。
kill -0 <PID>发送信号 0 给进程,不会实际终止进程,仅检查进程是否存在且有权限访问。若进程存在返回 0,否则非 0。本脚本用 pgrep -x 实现类似存在性检测。
pgrep -x <name>精确匹配进程名(-x 防止匹配部分字符串),返回进程 PID,用于检测和获取 PID。
/proc/<PID>/status虚拟文件,包含进程状态(State: 字段)、内存等信息。脚本从中提取进程状态。
eval "$start_cmd"执行启动命令,支持复杂命令(如带管道、重定向)。
& (后台运行)脚本中未直接使用,但若需将监控脚本本身置于后台,可在执行时添加 &,例如 ./monitor.sh nginx "systemctl start nginx" &
jobs / fgjobs 列出当前 Shell 的后台任务,fg %n 将后台任务调至前台。本脚本未涉及,但常用于交互式作业控制。

3. 运行截图说明(模拟输出)

执行 ./process_monitor.sh sshd "systemctl start sshd" 后,终端及日志内容如下:

image.png 若手动停止 sshd:systemctl stop sshd,则输出:

image.png

4. 设置开机自启动或 Cron 定期执行

方法一:通过 Systemd Service 实现开机自启 + 持续监控

创建服务文件 /etc/systemd/system/process-monitor.service

[Unit]
Description=Process Monitor for sshd
After=network.target
​
[Service]
Type=simple
ExecStart=/usr/local/bin/process_monitor.sh sshd "systemctl start sshd"
Restart=always
User=root
​
[Install]
WantedBy=multi-user.target

启用并启动:

sudo systemctl daemon-reload
sudo systemctl enable process-monitor.service
sudo systemctl start process-monitor.service

image.png

方法二:通过 Cron 的 @reboot 特性

在 crontab 中添加(crontab -e):

@reboot /usr/local/bin/process_monitor.sh sshd "systemctl start sshd" &

注意:需使用绝对路径,且末尾 & 使其后台运行,避免阻塞 cron。


二、周期性任务设计与内核管理实践

1. Crontab 配置内容

执行 crontab -e 添加以下两行:

# 每周日凌晨3点清理 /tmp 下超过7天的文件
0 3 * * 0 find /tmp -type f -mtime +7 -delete 2>/dev/null# 每天中午12点记录系统进程数和内存使用量
0 12 * * * echo "[$(date '+%Y-%m-%d %H:%M:%S')] Processes: $(ps -e | wc -l), Memory: $(free -m | awk '/^Mem:/ {print $3"/"$2 " MB used"}')" >> /var/log/system_health.log

2. Cron 时间语法、环境变量问题及日志查看

  • 时间字段含义(共5个):

    *    *    *    *    *  命令
    ┬    ┬    ┬    ┬    ┬
    │    │    │    │    └─── 星期几 (0 - 707为周日)
    │    │    │    └────── 月份 (1 - 12)
    │    │    └─────────── 日期 (1 - 31)
    │    └──────────────── 小时 (0 - 23)
    └─────────────────── 分钟 (0 - 59)
    

    示例中:

    • 0 3 * * 0 → 每周日 03:00
    • 0 12 * * * → 每天 12:00
  • 环境变量问题

    • Cron 运行时环境极其精简,仅有少数默认变量(PATH=/usr/bin:/bin),不加载用户 ~/.bashrc 等。

    • 解决方案

      • 在命令中使用绝对路径(如 /usr/bin/find/bin/echo)。
      • 在 crontab 文件顶部显式定义变量:PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
      • 或将命令封装成脚本,在脚本中 source 所需环境。
  • 日志查看

    • Cron 执行日志(Linux 发行版不同):

      • Debian/Ubuntu:/var/log/syslog(过滤 CRON
      • RHEL/CentOS:/var/log/cron
    • 查看命令示例:grep CRON /var/log/syslog | tail -20

3. 内核参数修改实践:vm.swappiness

临时修改(重启失效):

sudo sysctl -w vm.swappiness=10

永久修改(写入配置文件):

echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
# 或者独立文件
echo "vm.swappiness=10" | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl -p /etc/sysctl.d/99-swappiness.conf   # 立即生效

查看当前值(两种方式):

# 方式一:通过 sysctl
sysctl vm.swappiness

# 方式二:读取 /proc 虚拟文件
cat /proc/sys/vm/swappiness

4. /proc 文件系统的虚拟文件特性

  • /proc 是一个伪文件系统(procfs),存在于内存中,不占用磁盘空间。
  • 其下的文件和目录在访问时由内核动态生成内容,反映当前内核状态、进程信息、硬件配置等。
  • 例如 /proc/sys/vm/swappiness 文件实际上对应内核参数 vm.swappiness读取即查询内核值,写入(需 root)即修改内核运行时参数
  • 该特性使系统管理和监控无需额外工具,直接通过文件操作即可与内核交互。

5. 展示 crontab -l 输出和日志条目示例

crontab -l 输出

# 每周日凌晨3点清理 /tmp 下超过7天的文件
0 3 * * 0 find /tmp -type f -mtime +7 -delete 2>/dev/null

# 每天中午12点记录系统进程数和内存使用量
0 12 * * * echo "[$(date '+%Y-%m-%d %H:%M:%S')] Processes: $(ps -e | wc -l), Memory: $(free -m | awk '/^Mem:/ {print $3"/"$2 " MB used"}')" >> /var/log/system_health.log

/var/log/syslog 中的 Cron 条目示例

Apr 14 12:00:01 hostname CRON[12345]: (root) CMD (echo "[$(date '+%Y-%m-%d %H:%M:%S')] Processes: $(ps -e | wc -l), Memory: $(free -m | awk '/^Mem:/ {print $3"/"$2 " MB used"}')" >> /var/log/system_health.log)

/var/log/system_health.log 内容示例

[2026-04-14 12:00:01] Processes: 187, Memory: 1024/7982 MB used
[2026-04-15 12:00:01] Processes: 192, Memory: 1100/7982 MB used

6. 修改内核参数前后对比效果

修改前(默认值通常为 60):

$ sysctl vm.swappiness
vm.swappiness = 60
$ cat /proc/sys/vm/swappiness
60

修改后(临时或永久):

$ sudo sysctl -w vm.swappiness=10
vm.swappiness = 10
$ sysctl vm.swappiness
vm.swappiness = 10
$ cat /proc/sys/vm/swappiness
10

free -m 对比效果(swappiness 值影响内核使用交换空间的倾向,较低值减少交换使用):

  • 修改前:内存压力稍大时即使用 Swap。
  • 修改后:尽量使用物理内存,减少磁盘 I/O,适合数据库服务器等场景。

三、网络管理相关学习内容总结

网络管理部分主要涵盖以下知识点:

1. 网络基础与协议

  • TCP/IP 协议栈:理解分层模型(应用层、传输层、网络层、链路层),重点掌握 IP 地址分类、子网掩码、CIDR 表示法。
  • IP 协议:IPv4 地址结构、私有地址范围(A/B/C 类)、路由原理。
  • TCP/UDP:端口概念、三次握手/四次挥手、常用服务端口(22/SSH, 80/HTTP, 443/HTTPS 等)。

2. 网络配置实践

  • 网卡命名:传统 eth0Predictable Network Interface Names(如 ens33enp0s3)。

  • 网络配置文件

    • Debian/Ubuntu:/etc/network/interfaces
    • RHEL/CentOS:/etc/sysconfig/network-scripts/ifcfg-*
  • 使用 ip 命令(取代 ifconfig):

    • ip addr show – 查看 IP 地址
    • ip link set dev eth0 up/down – 启用/禁用网卡
    • ip route show – 查看路由表
  • nmcli:NetworkManager 命令行工具,用于图形化/命令行统一管理网络连接。

3. 常用网络工具命令

命令用途
ping测试网络连通性(ICMP)
ss查看 socket 统计信息(替代 netstat),ss -tunlp 常用
traceroute / mtr跟踪路由路径
nslookup / digDNS 查询
curl / wgetHTTP/HTTPS 客户端,用于下载或 API 测试
tcpdump抓包分析,网络排错利器
nc (netcat)端口扫描、数据传输、简易服务端/客户端

4. 高级网络特性

  • 网卡绑定(Bonding) :将多个物理网卡聚合成一个逻辑接口,提供冗余或带宽提升(模式如 active-backupbalance-rr)。

  • 网络组(Network Teaming) :RHEL 7+ 推荐的绑定替代方案,使用 teamd 守护进程。

  • 网桥(Bridge) :用于虚拟化环境,使虚拟机与宿主机共享同一物理网络。

  • 诊断工具

    • ethtool – 查看/修改网卡参数(速率、双工模式等)
    • iptraf-ng / nethogs – 实时流量监控
    • mtr – 结合 ping 与 traceroute 的动态路由分析

通过该课程学习,应能独立完成 Linux 系统的网络配置、故障排查、服务端口管理以及基础网络性能优化。