在網路管理中,有效監控 TCP 協定流量和效能至關重要。本文介紹如何利用 Shell 指令碼解析 netstat 輸出,計算封包傳輸失敗率,並在異常時發出警告。指令碼分為兩部分:第一部分定期記錄網路統計資料,第二部分解析日誌檔案並分析效能趨勢。getstats 指令碼利用 netstat -s -p tcp 命令取得 TCP 統計資料,並將其格式化輸出到日誌檔案。netperf 指令碼則解析日誌檔案,計算重傳率、逾時率等關鍵指標,並與預設閾值比較,在異常時發出警告。此外,文章也討論瞭如何利用 renicename 和 watch_and_nice 指令碼調整程式優先順序,以及解決 OS X 系統中檔案換行問題的方法,以提升系統管理效率。
網路狀態監控指令碼解析與實作
在 Unix 系統管理中,netstat 是一個非常有用的工具,用於監控網路流量和效能。然而,由於其輸出資訊量龐大且複雜,本篇文章將介紹如何撰寫指令碼來分析 TCP 協定流量,計算封包傳輸失敗率,並在數值異常時發出警告。
指令碼功能與設計
該指令碼主要分為兩個部分:第一部分負責定期記錄網路統計資料到日誌檔案;第二部分則解析日誌檔案,報告典型的效能資料以及任何異常或遞增的數值。
第一部分:記錄網路統計資料
該指令碼使用 netstat -s -p tcp 命令來取得 TCP 協定的統計資料,並將結果記錄到暫存檔案中。接著,它會從暫存檔案中提取所需的統計資料,包括傳送的封包數、重傳的封包數、接收的封包數、重複的 ACK 數、亂序封包數以及連線請求數。
#!/bin/bash
# getstats--每 'n' 分鐘,抓取 netstats 數值(透過 crontab)
logfile="/Users/taylor/.netstatlog" # 根據您的組態進行更改。
temp="/tmp/getstats.$$.tmp"
trap "$(which rm) -f $temp" 0
if [ ! -e $logfile ] ; then # 第一次執行?
touch $logfile
fi
( netstat -s -p tcp > $temp
# 檢查您第一次執行此指令碼時的 log 檔案:某些版本的 netstat
# 回報多於一行,這就是為什麼這裡使用 "| head -1"。
sent="$(grep 'packets sent' $temp | cut -d\ -f1 | sed 's/[^[:digit:]]//g' | head -1)"
resent="$(grep 'retransmitted' $temp | cut -d\ -f1 | sed 's/[^[:digit:]]//g')"
received="$(grep 'packets received$' $temp | cut -d\ -f1 | sed 's/[^[:digit:]]//g')"
dupacks="$(grep 'duplicate acks' $temp | cut -d\ -f1 | sed 's/[^[:digit:]]//g')"
outoforder="$(grep 'out-of-order packets' $temp | cut -d\ -f1 | sed 's/[^[:digit:]]//g')"
connectreq="$(grep 'connection requests' $temp | cut -d\ -f1 | sed 's/[^[:digit:]]//g')"
內容解密:
logfile和temp變數設定:logfile用於儲存長期網路統計資料,而temp用於暫存每次執行的netstat結果。trap命令:確保在指令碼離開時刪除暫存檔案,避免佔用系統資源。netstat -s -p tcp命令:取得 TCP 協定的詳細統計資訊。grep、cut和sed命令組合:用於從netstat的輸出中提取所需的統計資料,例如傳送的封包數和重傳的封包數。
第二部分:解析日誌檔案
第二部分的指令碼負責解析由第一部分產生的日誌檔案,分析網路效能趨勢,並在發現異常時發出警告。雖然這部分的指令碼程式碼未在給定的內容中提供,但其主要功能是讀取日誌檔案中的統計資料,計算相關指標(如封包丟失率),並與歷史資料進行比較,以檢測任何異常。
程式碼範例與解說
假設第二部分的指令碼如下:
#!/bin/bash
# analyze_logs--解析網路統計日誌檔案,報告效能和異常。
logfile="/Users/taylor/.netstatlog"
# 解析日誌檔案,計算相關指標。
while IFS= read -r line; do
# 處理每一行日誌資料。
echo "$line"
done < "$logfile"
內容解密:
logfile變數:指定要解析的日誌檔案路徑。while迴圈:逐行讀取日誌檔案,並對每一行進行處理。echo "$line":簡單地輸出每一行,實際應用中可以在此處新增邏輯來分析資料。
網路效能分析指令碼:getstats 與 netperf 詳解
在管理網路伺服器時,瞭解網路效能的關鍵指標至關重要。本文將探討兩個用於分析 netstat 輸出的指令碼:getstats 和 netperf。這兩個指令碼共同工作,以提供網路效能的詳細資訊和歷史趨勢分析。
getstats 指令碼解析
getstats 指令碼的主要任務是從 netstat -s -p tcp 的輸出中提取關鍵的網路效能統計資料。這些資料包括封包傳送數量、重傳次數、接收到的封包數量等。
程式碼片段:
connectacc="$(grep 'connection accepts' $temp | cut -d\ -f1 | sed 's/[^[:digit:]]//g')"
retmout="$(grep 'retransmit timeouts' $temp | cut -d\ -f1 | sed 's/[^[:digit:]]//g')"
/bin/echo -n "time=$(date +%s);"
/bin/echo -n "snt=$sent;re=$resent;rec=$received;dup=$dupacks;"
/bin/echo -n "oo=$outoforder;creq=$connectreq;cacc=$connectacc;"
echo "reto=$retmout"
內容解密:
- 資料提取:使用
grep和cut命令從netstat輸出中提取特定的統計資料,並透過sed移除非數字字元,確保輸出的純淨性。 - 格式化輸出:將提取的資料格式化為
var=value的形式,並附加時間戳記,然後輸出到日誌檔案netstat.log中。 eval命令的準備:這種輸出格式使得後續可以使用eval命令將日誌檔案中的每一行解析為 shell 變數。
netperf 指令碼詳解
netperf 指令碼負責解析 netstat.log 檔案,並報告最新的網路效能資料和任何異常情況。
程式碼片段:
eval $(tail -1 $log) # 所有值變成 shell 變數
rep="$(scriptbc -p 3 $re/$snt\*100)"
# ...
echo "Netstat 目前報告如下:"
/bin/echo -n " $snt 封包已傳送,其中 $re 重傳 ($rep%) "
echo "和 $reto 重傳逾時 ($retop%)"
# ...
if [ $repn -ge 5 ] ; then
echo "*** 警告:重傳率 >= 5% 表示存在問題 "
fi
內容解密:
- 最新資料分析:讀取
netstat.log的最後一行,使用eval將其內容轉換為 shell 變數,然後計算各種效能指標的百分比。 - 效能報告:輸出最新的網路效能資料,包括封包傳送數量、重傳率等。
- 異常檢測:檢查是否出現重傳率、逾時率等超出閾值(5%)的情況,並給出警告訊息。
指令碼協同工作流程
getstats蒐集資料:定期執行netstat -s -p tcp,並將關鍵統計資料寫入netstat.log。netperf分析資料:讀取netstat.log,解析最新的網路效能資料,進行歷史趨勢分析,並報告任何異常情況。
網路效能監控與程式優先順序調整指令碼解析
網路效能監控指令碼(netperf)
網路效能監控是系統管理中的重要環節。本文將深入解析 netperf 指令碼的工作原理及其改進方法。
1. 資料收集指令碼(getstats)
getstats 指令碼負責定期收集網路統計資料並儲存於 .netstatlog 檔案中。該指令碼通常由 crontab 定時執行。
*/15 * * * * /home/taylor/bin/getstats
2. 網路效能分析指令碼(netperf)
netperf 指令碼負責分析 .netstatlog 中的資料,提供網路效能的詳細資訊。
$ netperf
Netstat is currently reporting the following:
52170128 packets sent, with 16927 retransmits (0%) and 2722 retransmit timeouts (0%)
20290926 packets received, with 129910 dupes (.600%) and 18064 out of order (0%)
39841 total connection requests, of which 123 were accepted
Analyzing trends...
(Analyzed 6 netstat log entries for calculations)
程式碼解析
netperf 指令碼使用 while 迴圈處理 .netstatlog 中的每一行資料,計算關鍵的網路效能指標,如重傳率、逾時率等。這些資料被寫入 $stats 暫存檔中,然後使用 awk 對其進行匯總和分析。
while read line; do
# 解析資料並計算網路效能指標
done < .netstatlog
改進建議
- 使用人類可讀的時間格式:目前
.netstatlog使用 epoch 時間,可改為人類可讀的日期格式,便於直接閱讀和分析。 - 增強報表功能:可增加圖表生成功能,直觀展示網路效能趨勢。
- 報警機制:當檢測到異常網路活動時,自動傳送警示通知管理員。
程式優先順序調整指令碼(renicename)
renicename 指令碼允許管理員根據程式名稱調整其優先順序,從而最佳化系統資源分配。
使用方法
renicename [-n niceval] [-u user|-t tty] [-p] pattern
-n niceval:指定新的優先順序值。-u user或-t tty:根據使用者或終端篩選程式。-p:僅顯示匹配的程式 ID。
程式碼解析
指令碼使用 getopts 解析命令列引數,並根據指定的模式匹配程式 ID。然後,使用 renice 命令調整這些程式的優先順序。
while getopts "n:u:t:p" opt; do
case $opt in
n ) niceval="$OPTARG"; ;;
# 其他選項處理
esac
done
改進建議
- 增加正規表示式支援:允許使用者使用正規表示式匹配程式名稱,提高靈活性。
- 互動式介面:開發互動式介面,簡化指令碼的使用流程。
- 日誌記錄:記錄每次優先順序調整的操作,便於稽核和故障排除。
修正OS X檔案換行問題與實用指令碼解析
在Unix與類別Unix系統的世界中,蘋果的OS X系統是一個重要的里程碑。根據BSD Unix的Darwin核心為OS X提供了堅實的基礎,讓使用者在終端機中可以享受到完整的Unix體驗。然而,OS X與Linux/Unix之間存在一些差異,瞭解這些差異並善用一些小技巧,可以大大提升日常操作的效率。
OS X中的換行問題
在OS X中處理由圖形介面建立的檔案時,使用者可能會遇到換行字元不相容的問題。OS X使用的是回車符號(\r),而Unix系統則使用的是換行符號(\n)。這種差異會導致在終端機中檢視Mac檔案時出現不正確的換行。
問題範例
假設有一個名為mac-format-file.txt的檔案,在使用cat指令輸出其內容時,可能會看到以下結果:
$ cat mac-format-file.txt
$
檔案看似空白,但事實上它並非空檔案。使用cat的-v選項可以顯示隱藏的控制字元:
$ cat -v mac-format-file.txt
The rain in Spain^Mfalls mainly on^Mthe plain.^MNo kidding. It does.^M$
這裡的^M代表回車符號(\r)。
解決方案
利用tr指令可以輕鬆地將回車符號轉換為換行符號:
$ tr '\r' '\n' < mac-format-file.txt > unix-format-file.txt
轉換後,檔案內容即可正確顯示:
$ tr '\r' '\n' < mac-format-file.txt
The rain in Spain
falls mainly on
the plain.
No kidding. It does.
實用指令碼:renicename與watch_and_nice
除了處理換行問題,OS X的使用者還可以利用一些實用的指令碼來提升系統管理的效率。
renicename指令碼
renicename指令碼允許使用者根據行程名稱調整行程的優先順序。它會先找到符合指定模式的行程ID(PID),然後使用renice指令調整其優先順序。
#!/bin/bash
# renicename--Changes the priority of a process by name
if [ $# -eq 0 ] ; then
echo "Usage: $(basename $0) [-n niceval] pattern" >&2
exit 1
fi
# 程式碼邏輯解說:
#### 內容解密:
1. 檢查是否有輸入引數,若無則顯示用法並離開。
2. 解析命令列引數,包括`-n`選項指定的nice值。
3. 使用`ps`和`awk`指令找到符合指定模式的行程ID。
4. 若找到多個符合的行程,則提示使用者縮小搜尋範圍。
5. 使用`renice`指令調整指定行程的優先順序。
$ renicename "vi"
renicename: more than one process matches pattern vi:
user taylor pid 6584 job vi
user taylor pid 10949 job vi
Use -u user or -t tty to narrow down your selection criteria.
watch_and_nice指令碼
watch_and_nice指令碼則進一步擴充套件了renicename的功能,用於監視特定行程名稱並在發現時自動調整其優先順序。
#!/bin/bash
# watch_and_nice--Watches for the specified process name and renices it to the desired value when seen.
if [ $# -ne 2 ] ; then
echo "Usage: $(basename $0) desirednice jobname" >&2
exit 1
fi
pid="$(renicename -p "$2")"
if [ "$pid" == "" ] ; then
echo "No process found for $2"
exit 1
fi
currentnice="$(ps -lp $pid | tail -1 | awk '{print $6}')"
if [ $1 -gt $currentnice ] ; then
echo "Adjusting priority of $2 to $1"
renice $1 $pid
fi
exit 0
程式碼邏輯解說:
內容解密:
- 檢查輸入引數是否正確,若否則顯示用法並離開。
- 使用
renicename指令碼找到指定行程名稱對應的行程ID。 - 查詢該行程目前的nice值。
- 若指定的nice值大於目前的nice值,則使用
renice調整行程優先順序。