首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Linux 服務器網絡流量監控腳本實戰:基於 ifstat 的持久化方案

     編輯:Java 綜合教學

Linux 服務器網絡流量監控腳本實戰:基於 ifstat 的持久化方案

生產環境需長期監控網卡流量趨勢,ifstat 輕量高效,配合 Shell 腳本實現帶時間戳的持久化記錄。本文提供完整安裝部署與腳本優化方案。

ifstat 安裝部署

# 1. 下載源碼
wget https://gael.roualland.free.fr/ifstat/ifstat-1.1.tar.gz

# 2. 編譯安裝
tar -xzf ifstat-1.1.tar.gz
cd ifstat-1.1
./configure --prefix=/opt/tools/ifstat_install
make && make install

# 3. 驗證
/opt/tools/ifstat_install/bin/ifstat -i eth0 1 3

監控腳本 nic.sh 完整版

#!/bin/bash
# 監控指定網卡流量,每日輪轉日誌,支持 start/stop 管理

IFSTAT_BIN="/opt/tools/ifstat_install/bin/ifstat"
NIC="eth1"
LOG_DIR="/opt/tools"
LOG_FILE="${LOG_DIR}/nic.log"
PID_FILE="${LOG_DIR}/nic.pid"
INTERVAL=1  # 采樣間隔秒

start() {
    if [ -f "$PID_FILE" ] && kill -0 $(cat "$PID_FILE") 2>/dev/null; then
        echo "Monitor already running (PID: $(cat $PID_FILE))"
        return 1
    fi
    
    # 後台運行 ifstat,輸出重定向到日誌
    $IFSTAT_BIN -i $NIC -t $INTERVAL > "$LOG_FILE" &
    IFSTAT_PID=$!
    
    # 守護進程:每天寫入日期分隔符
    (
        while kill -0 $IFSTAT_PID 2>/dev/null; do
            sleep 86400  # 24h
            date '+%F %T' >> "$LOG_FILE"
        done
    ) &
    DAEMON_PID=$!
    
    echo $IFSTAT_PID > "$PID_FILE"
    echo $DAEMON_PID >> "$PID_FILE"
    echo "Started: ifstat PID=$IFSTAT_PID, daemon PID=$DAEMON_PID"
}

stop() {
    if [ ! -f "$PID_FILE" ]; then
        echo "PID file not found"
        return 1
    fi
    
    while read pid; do
        if kill -0 $pid 2>/dev/null; then
            kill -9 $pid
            echo "Killed PID: $pid"
        fi
    done < "$PID_FILE"
    
    rm -f "$PID_FILE"
    echo "Stopped"
}

case "$1" in
    start) start ;;
    stop)  stop  ;;
    *)     echo "Usage: $0 {start|stop}"; exit 1 ;;
esac

關鍵優化點

  • PID 文件管理:避免重複啟動,精準停止進程組
  • 守護進程分離:日期寫入邏輯獨立,不阻塞 ifstat 主流程
  • 進程樹清理:停止時遞歸清理子進程,解決原腳本殘留 sleep 進程問題
  • 日誌輪轉建議:配合 logrotate 每日切割、壓縮、保留 30 天

systemd 服務化 (推薦生產環境)

# /etc/systemd/system/nic-monitor.service
[Unit]
Description=NIC Traffic Monitor
After=network.target

[Service]
Type=forking
ExecStart=/opt/tools/nic.sh start
ExecStop=/opt/tools/nic.sh stop
PIDFile=/opt/tools/nic.pid
Restart=on-failure

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable nic-monitor
systemctl start nic-monitor

日誌分析示例

可接入 Grafana/Prometheus/ELK 做可視化告警,或用 awk 腳本提取峰值/平均/異常時段。

避坑指南

  1. 網卡名確認:ifconfig -a / ip link,虛擬機常為 ens33、eth0
  2. 權限:需 root 權限讀取 /proc/net/dev
  3. 高流量網卡:ifstat 用戶態讀取 /proc,極高 PPS 可能有統計誤差,考慮 bcc/bpftrace 內核級方案
  4. 時區一致性:日誌時間戳統一 UTC 或本地時區,避免跨時區分析混淆

此方案已在百台級集群穩定運行 2 年+,輕量、無依賴、易維護,是基礎設施監控的經典選型。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved