Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 記憶體使用監控 Shell 腳本:基於 /proc/PID/status 精準統計單進程 RSS

編輯:Linux 教學

Linux 標準工具 free、top 僅顯示整體記憶體,無法精準統計單一進程佔用。本文提供 Shell 腳本,遍歷 /proc 讀取各進程 VmRSS (Resident Set Size),匯總輸出進程名與記憶體 (KB),並計算總計 (MB)。

腳本原理

  • /proc/PID/status 包含 VmRSS: 12345 kB 欄位,代表進程駐留實體記憶體。
  • 遍歷 /proc 下數字目錄 (PID),提取 Name 與 VmRSS。
  • 累加所有進程 RSS,換算為 MB。

完整腳本 (mem_monitor.sh)

#!/bin/bash
# 輸出檔案
OUTFILE="/root/script/pid.f"
echo -e "PidName\tMeMery_KB" > "$OUTFILE"

PIDPATH="/proc"
TOTAL_KB=0

cd "$PIDPATH" || exit 1
for PID in *; do
    if [[ -d "$PID" && -f "$PID/status" ]]; then
        # 提取 VmRSS (KB)
        RSS=$(awk '/^VmRSS:/{print $2}' "$PID/status")
        # 提取進程名
        PNAME=$(awk '/^Name:/{print $2}' "$PID/status")
        if [[ -n "$RSS" && "$RSS" -gt 0 ]]; then
            echo -e "${PNAME}\t${RSS}" >> "$OUTFILE"
            TOTAL_KB=$((TOTAL_KB + RSS))
        fi
    fi
done

TOTAL_MB=$((TOTAL_KB / 1024))
echo -e "\nTOTAL USED: ${TOTAL_MB} MB" >> "$OUTFILE"
cat "$OUTFILE"

使用方法

chmod +x mem_monitor.sh
./mem_monitor.sh
# 輸出範例
PidName MeMery_KB
systemd     12345
sshd         2345
nginx       45678
...
TOTAL USED: 1234 MB

進階擴充建議

  • 排除核心執行緒:/proc/PID/status 無 VmRSS 或 Name 為 kthreadd 等可跳過。
  • 加入 PID 欄位:方便對應 top -p PID 進階分析。
  • 定時記錄:配合 cron 每 5 分鐘輸出至帶時間戳檔案,趨勢分析。
  • 閾值告警:單進程超過設定值發送郵件/釘釘/企業微信通知。
  • 使用 ps 替代:ps -eo pid,comm,rss --sort=-rss | head -20 更簡潔,但無法獲取總計。

注意事項

  • 需 root 權限讀取所有 /proc/PID/status。
  • RSS 不含 Swap、共享記憶體僅計算一次,總和可能略大於 free -m 的 used。
  • 容器環境下 /proc 為宿主機視角,容器內進程 RSS 需結合 cgroup 限制查看。
Copyright © Windows教程網 All Rights Reserved