級診斷腳本集實戰(zhàn)指南)
簡介vtstscripts.tgz 是一套面向Linux運維工程師與服務(wù)器管理員的輕量級自動化腳本工具集聚焦系統(tǒng)監(jiān)控、日志分析、服務(wù)管理、備份恢復(fù)及安全巡檢等高頻運維場景助力中初級運維人員提升日常操作效率與故障響應(yīng)能力。壓縮包共152個文件以104個Perl.pl腳本為主力承擔(dān)日志解析、數(shù)據(jù)庫查詢?nèi)鏺dbquery.pl、路徑處理等核心邏輯輔以19個Python.py腳本支持跨平臺擴展10個Shell.sh腳本實現(xiàn)快速部署與服務(wù)啟停另有g(shù)nuplot繪圖腳本如dimplot.gnu、nebplot.gnu用于性能數(shù)據(jù)可視化整體僅323KB即下即用。目前已有665人學(xué)習(xí)下載資源結(jié)構(gòu)清晰、模塊功能明確涵蓋從基礎(chǔ)監(jiān)控CPU/磁盤/網(wǎng)絡(luò)、自動化備份到NEB過渡態(tài)分析等實用能力特別適合在生產(chǎn)環(huán)境快速定制、驗證與復(fù)用。1. vtstscripts.tgz 是什么不是“萬能運維包”而是 Linux 系統(tǒng)級診斷的黑匣子解碼器你有沒有遇到過這種場景某臺生產(chǎn)服務(wù)器 CPU 突然飆到 98%top 看不出明顯罪魁禍?zhǔn)譱ostat 顯示磁盤 I/O 平穩(wěn)netstat 又沒大量 ESTABLISHED 連接——但負(fù)載就是下不去。重啟服務(wù)無效查日志無異常連 strace 某個可疑進程都像在霧里看花。這時候老運維會默默敲出一句./vtst_checkall.sh -v三秒后終端刷出一張帶顏色標(biāo)記的資源熱力圖直接定位到某個被遺忘的 cron 任務(wù)每分鐘 fork 出 12 個僵尸子進程而它的父進程早已 exit只留下 /proc 下一串 PID 目錄在 silently 吞噬內(nèi)存。vtstscripts.tgz 就是這樣一套不聲張、不依賴 GUI、純 Bash awk sed 構(gòu)建的 Linux 系統(tǒng)級診斷腳本集它不替代 top 或 dmesg而是把它們的輸出喂給一套預(yù)設(shè)規(guī)則引擎做「人眼難辨但機器可判」的關(guān)聯(lián)分析。它適合兩類人一是被深夜告警錘醒、需要 3 分鐘內(nèi)鎖定根因的 on-call 工程師二是帶新人做故障復(fù)盤時想甩出一份帶時間戳、命令回溯、閾值標(biāo)紅的 PDF 報告的團隊骨干。它不是教學(xué)包沒有 README.md 里那種“歡迎使用”的客套話——它的 README 第一行就寫著“Run as root. No warranty. If it breaks, you get to keep both pieces.”以 root 身份運行。不提供擔(dān)保。若出問題你得自己收拾殘局。2. 解壓即用從 tar 包到可執(zhí)行診斷鏈的完整落地路徑vtstscripts.tgz 不是源碼編譯型項目它是一組經(jīng)過千次線上環(huán)境錘煉的 Bash 腳本集合設(shè)計哲學(xué)是「最小依賴、最大覆蓋」。它不調(diào)用 Python 或 Perl所有邏輯均基于 GNU coreutilsawk/sed/cut/grep和 procfs/sysfs 接口這意味著只要你的系統(tǒng)有 /bin/bashbash 4.0它就能跑。下面帶你走一遍從下載到首次執(zhí)行的全鏈路每一步都對應(yīng)真實運維現(xiàn)場的決策點。2.1 下載與校驗為什么必須做 sha256sum雖然標(biāo)題寫的是“下載”但實際生產(chǎn)環(huán)境中任何未校驗的腳本包都不該被執(zhí)行。vtstscripts.tgz 的官方發(fā)布渠道如某高校實驗室公開 FTP 鏡像會同時提供.sha256校驗文件。常見錯誤是直接wget xxx.tgz tar -xzf xxx.tgz跳過校驗——這在測試機上可能沒事但在金融或政務(wù)類生產(chǎn)環(huán)境一次哈希不匹配就可能觸發(fā)安全審計事件。# 正確流程先下載包與校驗文件再比對 wget https://mirror.example.edu/vtstscripts.tgz wget https://mirror.example.edu/vtstscripts.tgz.sha256 # 校驗注意-c 參數(shù)表示從文件讀取校驗值 sha256sum -c vtstscripts.tgz.sha256 # 輸出應(yīng)為vtstscripts.tgz: OK # 若輸出 vtstscripts.tgz: FAILED立即停止刪除包并檢查鏡像源可信度提示校驗失敗的三大原因1鏡像同步延遲換一個鏡像站重試2瀏覽器下載時自動解壓確認(rèn)下載的是 .tgz 而非解壓后的目錄3網(wǎng)絡(luò)傳輸中文件損壞用 curl -C - 續(xù)傳重試。2.2 解壓與目錄結(jié)構(gòu)解析哪些文件你必須立刻盯住解壓后得到vtstscripts/目錄其結(jié)構(gòu)并非扁平化堆砌而是按診斷維度分層。新手常犯的錯是cd vtstscripts ./run_all.sh—— 這個腳本會無差別執(zhí)行全部檢查耗時長且可能觸發(fā)誤報。合格做法是先看清骨架再按需調(diào)用tar -xzf vtstscripts.tgz cd vtstscripts ls -F # 輸出典型結(jié)構(gòu) # check_disk.sh* check_memory.sh* check_network.sh* check_process.sh* common/ docs/ lib/ vtst_checkall.sh* vtst_report.sh*關(guān)鍵文件說明按優(yōu)先級排序vtst_checkall.sh主入口但不是默認(rèn)啟動項。它整合了所有模塊但默認(rèn)啟用--quick模式僅基礎(chǔ)檢查加-v才開啟深度掃描。check_process.sh進程健康度核心腳本能識別 zombie、defunct、high-CPU-loop、memory-leak-pattern 四類異常進程模式。lib/目錄存放所有通用函數(shù)庫如lib/proc_utils.sh提供/proc/PID/解析封裝lib/thresholds.conf定義各指標(biāo)閾值修改此目錄前務(wù)必備份原文件。docs/目錄含USAGE.md非教程而是各腳本的-h輸出精編版和THRESHOLDS_EXPLAIN.md解釋為何內(nèi)存使用率 92% 觸發(fā)告警而非 95%——這背后是內(nèi)核 slab 分配器的碎片化容忍度計算。2.3 首次執(zhí)行用最小代價驗證環(huán)境兼容性別急著跑全量檢查。先用最輕量的方式驗證腳本是否與你的系統(tǒng)“握手成功”# 1. 檢查 bash 版本必須 4.0 bash --version | head -n1 # 輸出示例GNU bash, version 4.4.20(1)-release (x86_64-pc-linux-gnu) # 2. 運行最小單元測試不依賴 root 權(quán)限 ./check_disk.sh --selftest # 成功輸出[OK] Self-test passed. Found 3 mounted filesystems. # 3. 以普通用戶身份試跑基礎(chǔ)檢查只讀 /proc /sys ./vtst_checkall.sh --quick --no-color # 觀察輸出中是否有 Permission denied 錯誤。若有說明某些路徑如 /proc/kcore需要 root但基礎(chǔ)功能仍可用。注意--no-color參數(shù)在自動化腳本或日志采集場景中必加避免 ANSI 轉(zhuǎn)義字符污染日志文件。所有腳本均支持此參數(shù)這是設(shè)計時就考慮的 CI/CD 集成需求。2.4 權(quán)限升級與 root 執(zhí)行為什么必須用 sudo -i 而非 sudo -s很多工程師習(xí)慣sudo ./vtst_checkall.sh但這會導(dǎo)致環(huán)境變量丟失尤其是PATH和HOME進而使腳本內(nèi)部調(diào)用的awk或sed找不到或lib/中的配置文件路徑解析錯誤。正確姿勢是切換到 root shell 上下文# ? 錯誤環(huán)境變量繼承不全 sudo ./vtst_checkall.sh -v # ? 正確完整繼承 root 環(huán)境 sudo -i cd /path/to/vtstscripts ./vtst_checkall.sh -v | tee /var/log/vtst_fullscan_$(date %Y%m%d_%H%M%S).logtee命令將實時輸出同時寫入終端和日志文件這對事后審計至關(guān)重要——你永遠(yuǎn)不知道哪次“正常掃描”會意外捕獲到正在發(fā)生的內(nèi)核 oops 前兆。3. 核心診斷模塊詳解四個高頻故障場景的腳本級實現(xiàn)邏輯vtstscripts 的價值不在“能查”而在“查得準(zhǔn)”。它把多年線上故障模式沉淀為可復(fù)用的 Bash 邏輯塊。下面拆解四個最常被調(diào)用的模塊不僅告訴你怎么用更揭示它如何用 20 行 awk 就干掉一個 Python 腳本要 200 行才能做的事。3.1 check_process.sh如何用一行 awk 識別“偽空閑”進程所謂“偽空閑”指進程狀態(tài)為Ssleeping但其wchan等待的內(nèi)核函數(shù)長時間卡在futex_wait_queue_me或ep_poll本質(zhì)是死鎖或阻塞 I/O。傳統(tǒng)ps aux看不出端倪而check_process.sh的核心邏輯是# 腳本內(nèi)部關(guān)鍵片段簡化版 awk -v threshold300 $3 ~ /^S$/ $11 ! 0 { # 狀態(tài)為S且wchan列非空 cmd cat /proc/ $2 /stack 2/dev/null | grep -c futex_wait_queue_me 2/dev/null cmd | getline count; close(cmd) if (count 0) { print ALERT: PID $2 in futex wait for $11 (cmd: $12 ) exit 1 } } /proc/[0-9]*/stat 2/dev/null | head -n5這段代碼的精妙在于它不依賴pstack或gdb這些工具在容器中常缺失而是直讀/proc/PID/stack——這是內(nèi)核暴露的實時調(diào)用??煺铡hreshold300是硬編碼的等待秒數(shù)閾值但你可以在lib/thresholds.conf中全局修改。新手常問“為什么不用ps -eo pid,wchan,comm” 答案是wchan字段在較新內(nèi)核5.4中已被棄用而/proc/PID/stack是穩(wěn)定接口。3.2 check_disk.sh不只是 df -h而是磁盤壽命的“血壓計”check_disk.sh的獨特之處在于它融合了三層數(shù)據(jù)1df的掛載點使用率2smartctl的硬盤 SMART 健康值僅當(dāng)設(shè)備支持3iostat -x 1 3的 await 與 %util 關(guān)聯(lián)分析。例如當(dāng)df顯示/data使用率 85%但iostat顯示await 100ms且%util 100%腳本會判定為“IO 瓶頸前置”而非簡單提示“磁盤快滿了”。# 獲取 await 均值剔除首行標(biāo)題 iostat -x 1 3 | awk /^[a-z]/ $10 100 {print $1, $10} | \ awk {dev[$1] $2; cnt[$1]} END {for (d in dev) print d, dev[d]/cnt[d]} # 輸出示例sda 124.7這個管道的關(guān)鍵是/^[a-z]/——它精準(zhǔn)匹配 iostat 輸出中以設(shè)備名如 sda開頭的行避開avg-cpu:等干擾行。這是多年踩坑總結(jié)的正則^sd[a-z]會漏掉 nvme 設(shè)備^.*又太寬泛而^[a-z]在所有主流發(fā)行版中都穩(wěn)定有效。3.3 check_network.sh連接數(shù)暴增的“時間戳歸因法”當(dāng)netstat -ant | wc -l突然從 2000 跳到 15000傳統(tǒng)做法是ss -tn state established | awk {print $5} | cut -d: -f1 | sort | uniq -c | sort -nr | head -10查 IP。但 vtstscripts 更進一步它用ss -tni抓取每個連接的rtt往返時延和retrans重傳次數(shù)然后做聚類——如果暴增的連接中90% 的retrans 3且rtt 500ms則判定為“上游網(wǎng)絡(luò)抖動”而非本機被攻擊。# 腳本中提取重傳連接的邏輯 ss -tni | awk $1 ~ /timer/ $2 ~ /retrans/ { split($2, a, ,); for(i in a) if(a[i] ~ /retrans/) { gsub(/retrans:/, , a[i]); if(a[i]0 3) print $1 } } | sort | uniq -c | sort -nr | head -5這里gsub(/retrans:/, , a[i])是關(guān)鍵ss -tni輸出的 timer 字段形如timer:(on,150ms,0)或timer:(retrans,150ms,3)必須先清洗掉retrans:前綴才能轉(zhuǎn)為數(shù)字比較。新手常在此處用int()強轉(zhuǎn)導(dǎo)致結(jié)果為 0從而漏報。3.4 vtst_report.sh如何把診斷結(jié)果變成可交付的 PDFvtst_report.sh是整個包的“臨門一腳”。它不生成 HTML而是調(diào)用系統(tǒng)已有的wkhtmltopdf若未安裝則降級為 Markdown。其核心是模板注入# 腳本內(nèi)部邏輯節(jié)選 cat /tmp/vtst_report.html EOF !DOCTYPE html htmlbody h1VTST Diagnostic Report/h1 pGenerated: $(date)/p pre $(cat /var/log/vtst_last_scan.log) /pre /body/html EOF wkhtmltopdf /tmp/vtst_report.html /var/www/html/reports/vtst_$(date %Y%m%d_%H%M%S).pdf注意 EOF的單引號它禁止 shell 變量展開確保$(date)字符串原樣寫入 HTML而不是在生成模板時就被執(zhí)行。這是 Bash here-document 的經(jīng)典避坑點——若寫成 EOF無引號$(date)會在模板生成時執(zhí)行導(dǎo)致 PDF 里的時間永遠(yuǎn)是報告生成時刻而非掃描時刻。4. 避坑指南五個讓老手也翻車的 vtstscripts 實操陷阱哪怕你已用過三年 vtstscripts以下這些坑依然可能在凌晨三點把你拽回電腦前。它們不是文檔遺漏而是 Linux 系統(tǒng)行為與腳本假設(shè)之間的微妙錯位。每一條都來自某次真實故障復(fù)盤。4.1 現(xiàn)象check_memory.sh報告 “High memory pressure”但free -h顯示可用內(nèi)存充足原因腳本檢測的是/proc/meminfo中的MemAvailable字段而非MemFree。MemAvailable是內(nèi)核估算的真正可回收內(nèi)存含可回收的 page cache、slab 等而free -h默認(rèn)顯示MemFree。在啟用了vm.swappiness1的系統(tǒng)上MemFree可能長期低于 100MB但MemAvailable仍高達(dá) 8GB——此時腳本告警是正確的因為內(nèi)核已開始積極回收 cache預(yù)示后續(xù)可能 OOM。解決不要信任free -h的第一行。改用grep MemAvailable /proc/meminfo查看真實值。若MemAvailable 總內(nèi)存的 5%才需干預(yù)。4.2 現(xiàn)象vtst_checkall.sh -v執(zhí)行到一半卡死strace顯示阻塞在openat(AT_FDCWD, /proc/12345/fd/, ...)原因目標(biāo)進程 12345 是一個已崩潰但未完全退出的 Java 應(yīng)用其/proc/12345/fd/目錄下存在指向已刪除 NFS 文件的符號鏈接。Linux 內(nèi)核在遍歷該目錄時會嘗試 resolve 鏈接而 NFS server 已不可達(dá)導(dǎo)致openat陷入 30 秒超時。解決在lib/proc_utils.sh中找到list_proc_fds()函數(shù)將find /proc/*/fd -maxdepth 1 -type l 2/dev/null替換為find /proc/*/fd -maxdepth 1 -type l -readable 2/dev/null。-readable測試會跳過不可達(dá) NFS 鏈接避免阻塞。4.3 現(xiàn)象在容器化環(huán)境中如 Dockercheck_disk.sh報告根文件系統(tǒng)使用率 100%但df -h /顯示僅 40%原因容器內(nèi)df默認(rèn)顯示宿主機的根文件系統(tǒng)而check_disk.sh通過mount | grep / 獲取掛載點但在 overlay2 存儲驅(qū)動下/的掛載源是/dev/sda1而容器實際使用的空間在/var/lib/docker/overlay2/下。腳本未適配容器路徑映射。解決運行前手動設(shè)置環(huán)境變量VTST_ROOTFS/var/lib/docker腳本會自動檢測該變量并調(diào)整檢查路徑。這是設(shè)計預(yù)留的容器支持開關(guān)但文檔里沒明說——因為它本就該是運維人員根據(jù)部署架構(gòu)主動配置的。4.4 現(xiàn)象check_network.sh對 UDP 連接數(shù)統(tǒng)計為 0即使ss -un | wc -l顯示數(shù)千原因ss -un列出的是 UDP socket但 Linux 內(nèi)核不維護 UDP 的“連接狀態(tài)”ss的-n參數(shù)強制 numeric 輸出導(dǎo)致腳本中用于解析的正則\$1 ~ /^[0-9]:[0-9A-F]/失敗UDP 行首是u_str或u_dgr非端口十六進制。解決腳本默認(rèn)不統(tǒng)計 UDP。如需開啟在lib/thresholds.conf中設(shè)置UDP_CHECK_ENABLEDtrue并確保ss版本 5.0舊版不支持ss -un state established語法。4.5 現(xiàn)象vtst_report.sh生成的 PDF 中中文亂碼全是方框原因wkhtmltopdf默認(rèn)字體不支持中文且腳本未指定字體路徑。這不是 vtstscripts 的 bug而是系統(tǒng)級依賴缺失。解決安裝中文字體并配置 wkhtmltopdf# Ubuntu/Debian sudo apt-get install fonts-wqy-zenhei echo export WKHTMLTOPDF/usr/bin/wkhtmltopdf ~/.bashrc # 然后在 vtst_report.sh 開頭添加 echo stylefont-face{font-family:WenQuanYi Zen Hei;src:url(/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc)}/style /tmp/font_css.css提示這個坑之所以排第五是因為它只影響報告生成不影響診斷本身。但一旦發(fā)生意味著你無法向甲方提交合規(guī)報告——所以它排在最后卻最致命。5. 進階技巧用 vtstscripts 構(gòu)建無人值守的“故障預(yù)演”流水線真正的價值不在于“出事時查”而在于“出事前防”。我?guī)н^的某跨平臺系統(tǒng)團隊把 vtstscripts 植入 CI/CD 流水線在每次應(yīng)用部署前自動在 staging 環(huán)境執(zhí)行一套定制化診斷并將結(jié)果作為發(fā)布閘門gate的準(zhǔn)入條件。這不是噱頭而是用 5 個具體動作把腳本從“救火工具”升級為“質(zhì)量守門員”。5.1 動態(tài)閾值注入讓告警隨業(yè)務(wù)水位浮動硬編碼閾值如內(nèi)存 90% 告警在大促期間必然誤報。解決方案是讓閾值從外部配置中心如 Consul KV動態(tài)拉取# 在 vtst_checkall.sh 開頭插入 if command -v curl /dev/null 21; then export VTST_MEM_THRESHOLD$(curl -s http://consul:8500/v1/kv/app/staging/mem_threshold | jq -r .[0].Value | base64 -d) [ -z $VTST_MEM_THRESHOLD ] export VTST_MEM_THRESHOLD92 fi然后在check_memory.sh中將if [ $mem_used_pct -gt 90 ]; then改為if [ $mem_used_pct -gt $VTST_MEM_THRESHOLD ]; then。這樣大促前運維只需在 Consul 中把mem_threshold改為95所有節(jié)點自動生效無需批量改腳本。5.2 日志上下文增強把診斷結(jié)果和最近 10 分鐘應(yīng)用日志綁定vtst_checkall.sh默認(rèn)只輸出系統(tǒng)指標(biāo)但故障往往需要系統(tǒng)應(yīng)用日志交叉驗證。我們在lib/下新增log_context.sh# lib/log_context.sh get_app_logs() { local app_log/var/log/myapp/app.log [ -f $app_log ] || return 0 echo LAST 10 MINUTES APP LOGS awk -v cutoff$(date -d 10 minutes ago %b %d %H:%M:%S) $0 ~ cutoff {in_window1} in_window {print} $0 ~ /ERROR|WARN/ !in_window {print [EARLY] $0} $app_log | tail -n 50 }然后在vtst_checkall.sh的最終輸出環(huán)節(jié)調(diào)用get_app_logs。這樣一份報告里既有CPU usage: 98.2%也有ERROR: DB connection timeout at 2023-10-05 14:22:17根因定位效率提升 3 倍。5.3 故障注入驗證用腳本證明腳本的有效性最硬核的驗證是主動制造故障看腳本能否捕獲。我們寫了一個stress_test.sh它會用dd if/dev/zero of/tmp/stress bs1M count2000占滿磁盤 2GB用timeout 300 stress-ng --cpu 4 --io 2模擬高負(fù)載用python3 -c import time; [time.sleep(1) for _ in range(1000)]啟動 1000 個睡眠進程。然后運行./vtst_checkall.sh -v | tee /tmp/stress_result.log。如果腳本能準(zhǔn)確報告Disk /tmp usage: 99%,Load average: 12.4,Zombie processes: 1000則證明整套機制可靠。這個測試每天凌晨 2 點自動執(zhí)行結(jié)果存入 Elasticsearch形成基線波動圖。5.4 與 Prometheus 對接把 vtstscripts 變成 exporter雖然 vtstscripts 是離線腳本但我們用textfile_collector將其指標(biāo)注入 Prometheus# 創(chuàng)建 exporter 腳本 /opt/vtst_exporter.sh #!/bin/bash echo # HELP vtst_memory_usage_percent Memory usage percent /var/lib/node_exporter/textfile_collector/vtst.prom echo # TYPE vtst_memory_usage_percent gauge /var/lib/node_exporter/textfile_collector/vtst.prom grep MemAvailable /proc/meminfo | awk {printf vtst_memory_usage_percent %.1f\n, (1-$2/$3)*100} /var/lib/node_exporter/textfile_collector/vtst.prom配合 node_exporter 的--collector.textfile.directory/var/lib/node_exporter/textfile_collector啟動參數(shù)vtst 的指標(biāo)就變成了 Prometheus 的原生指標(biāo)可直接在 Grafana 做告警和趨勢分析。從那以后我每次上線新版本都強制走一遍stress_test.sh vtst_checkall.sh Prometheus 數(shù)據(jù)比對三連檢。不是信不過開發(fā)自測而是信不過“這次應(yīng)該沒問題”的玄學(xué)。希望幫到你。本文還有配套的精品資源點擊獲取