1. 命令概述與分類
1.1 為什么要掌握這些命令
系統(tǒng)命令是運維工程師與服務(wù)器交互的基礎(chǔ)工具。雖然現(xiàn)代運維工作有大量的自動化工具和平臺,但掌握核心系統(tǒng)命令仍然必要。命令行工具響應(yīng)速度快、不依賴圖形界面、可以組合使用應(yīng)對復(fù)雜場景。在服務(wù)器故障的緊急情況下,命令行往往是最高效的診斷和處置手段。
運維工作中常見的問題場景包括:服務(wù)器SSH連接不上、業(yè)務(wù)響應(yīng)超時、磁盤空間爆滿、進程異常退出。這些問題的排查往往需要在命令行環(huán)境下進行快速診斷。掌握核心命令可以大幅縮短故障排查時間,提升運維效率。
系統(tǒng)命令的掌握程度直接影響運維工作的效率。一位熟練掌握系統(tǒng)命令的工程師,可以在幾分鐘內(nèi)定位問題,而經(jīng)驗不足的工程師可能需要幾小時。命令的組合使用可以應(yīng)對各種復(fù)雜場景,這是圖形化工具難以替代的。
1.2 命令分類
本文將10個核心命令分為五類:
系統(tǒng)監(jiān)控類包括top、htop用于進程和資源監(jiān)控;vmstat用于虛擬內(nèi)存統(tǒng)計;iostat用于磁盤IO統(tǒng)計。這類命令幫助運維人員快速了解系統(tǒng)負載情況。
網(wǎng)絡(luò)診斷類包括netstat、ss用于網(wǎng)絡(luò)連接狀態(tài)查看;tcpdump用于網(wǎng)絡(luò)數(shù)據(jù)包抓??;lsof用于文件與端口關(guān)聯(lián)查看。這類命令是網(wǎng)絡(luò)故障排查的利器。
磁盤分析類包括df、du用于磁盤空間分析。這類命令幫助運維人員快速定位磁盤空間問題。
文本處理類包括find、awk、sed用于文本搜索和處理。這類命令在日志分析和配置處理場景中使用頻繁。
服務(wù)管理類包括systemctl、service用于服務(wù)啟停管理;rsync用于數(shù)據(jù)同步。這類命令是日常運維的基本操作。
2. 命令詳解
2.1 top與htop
top是Linux下最常用的進程監(jiān)控命令,實時顯示系統(tǒng)的整體狀態(tài)和各個進程的資源占用情況。top默認每3秒刷新一次數(shù)據(jù),可以通過-d參數(shù)調(diào)整刷新間隔。
top輸出的第一行是系統(tǒng)負載信息,包含當(dāng)前時間、系統(tǒng)運行時間、當(dāng)前登錄用戶數(shù)、1分鐘/5分鐘/15分鐘平均負載。負載數(shù)值如果持續(xù)高于CPU核心數(shù),說明系統(tǒng)存在性能瓶頸。
top - 1030 up 100 days, 3:22, 2 users, load average: 1.25, 0.98, 0.85
load average的三個數(shù)字分別代表1分鐘、5分鐘、15分鐘的平均負載。判斷負載是否過高需要結(jié)合CPU核心數(shù):8核CPU的負載不超過8算正常,超過8說明負載過高。
第二行是進程統(tǒng)計信息,顯示總進程數(shù)、運行中的進程數(shù)、睡眠中的進程數(shù)、停止的進程數(shù)、僵尸進程數(shù)。僵尸進程數(shù)如果大于0,需要檢查對應(yīng)的父進程。
Tasks: 245 total, 3 running, 242 sleeping, 0 stopped, 0 zombie
第三行和第四行是CPU和內(nèi)存使用情況的匯總。CPU行的us表示用戶空間占用比例,sy表示內(nèi)核空間占用比例,id表示空閑比例。如果wa(等待IO)數(shù)值持續(xù)較高,說明系統(tǒng)存在IO瓶頸。
%Cpu(s): 25.3 us, 5.2 sy, 0.0 ni, 68.5 id, 0.0 wa, 0.8 hi, 0.2 si, 0.0 st KiB Mem : 32768032 total, 8192000 free, 16384000 used, 8192032 buff/cache
進程列表默認按CPU使用率排序,可以通過P(大寫)切換到CPU排序,M切換到內(nèi)存排序,T切換到運行時間排序。按q鍵退出top。
top交互命令匯總:
| 按鍵 | 功能 |
|---|---|
| q | 退出top |
| P | 按CPU使用率排序 |
| M | 按內(nèi)存使用率排序 |
| T | 按運行時間排序 |
| 1 | 切換顯示每個CPU核心 |
| c | 顯示完整命令行 |
| k | 終止進程 |
| r | 調(diào)整進程優(yōu)先級 |
| u | 按用戶過濾 |
| n | 設(shè)置顯示進程數(shù)量 |
| W | 保存配置到文件 |
htop是top的增強版本,提供了更友好的界面和更多功能。htop支持鼠標(biāo)操作,顏色區(qū)分不同類型進程,可以水平滾動查看完整命令行參數(shù)。htop還可以直接向進程發(fā)送信號,支持進程樹視圖。
htop界面布局:
CPU [|||||||||||||||||||||||||||||||||||||||] 85% Mem [|||||||||||||||||||||||||||||||||||||] 72% Swp [|| ] 5% PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command 1234 nginx 20 0 128M 64M 12M R 45.2 12.5 15:32.11 nginx: worker 5678 mysql 20 0 2.1G 1.8G 156M S 25.0 5.5 2:45.33 mysqld 9012 redis 20 0 45M 32M 8M S 10.5 3.2 0:23.11 redis-server
htop常用快捷鍵:
| 按鍵 | 功能 |
|---|---|
| F1 | 幫助 |
| F2 | 設(shè)置 |
| F3 | 搜索進程 |
| F4 | 過濾器 |
| F5 | 樹形視圖 |
| F6 | 排序 |
| F7/F8 | 調(diào)整nice值 |
| F9 | 發(fā)送信號 |
| F10 | 退出 |
使用場景舉例:服務(wù)器響應(yīng)緩慢時,使用top查看是哪個進程占用CPU或內(nèi)存最高。如果發(fā)現(xiàn)某個Java進程CPU占用100%,需要進一步使用jstack分析線程堆棧。
# 查找CPU占用最高的進程 top -c # 查看特定用戶的進程 top -u nginx # 實時監(jiān)控,每秒刷新 top -d 1 # 查看所有CPU核心的使用情況 top - 1 # 保存top輸出到文件 top -b -n 1 > top_output.txt
2.2 netstat與ss
netstat是查看網(wǎng)絡(luò)連接狀態(tài)的經(jīng)典命令,可以顯示網(wǎng)絡(luò)協(xié)議統(tǒng)計信息和網(wǎng)絡(luò)連接狀態(tài)。netstat的常用參數(shù)組合是-anp,其中-a顯示所有連接,-n不解析主機名和服務(wù)名,-p顯示進程信息。
netstat -anp Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1234/sshd tcp 0 48 10.0.0.5:22 192.168.1.100:54321 ESTABLISHED 1234/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 4567/cupsd tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 7890/mysqld
netstat的輸出包含協(xié)議類型、本地地址、外部地址、狀態(tài)、進程ID和進程名稱。狀態(tài)列顯示TCP連接的狀態(tài),常見狀態(tài)包括LISTEN(監(jiān)聽中)、ESTABLISHED(已建立)、TIME_WAIT(等待關(guān)閉)、CLOSE_WAIT(等待關(guān)閉)。
TCP連接狀態(tài)說明:
| 狀態(tài) | 說明 |
|---|---|
| LISTEN | 等待連接,服務(wù)器socket正在監(jiān)聽 |
| ESTABLISHED | 連接已建立,雙方可以傳輸數(shù)據(jù) |
| TIME_WAIT | 等待足夠時間確保對方收到關(guān)閉請求 |
| CLOSE_WAIT | 等待本地應(yīng)用程序關(guān)閉連接 |
| SYN_SENT | 正在發(fā)送連接請求 |
| SYN_RECV | 收到連接請求并發(fā)送確認 |
| FIN_WAIT1 | 主動關(guān)閉,發(fā)送FIN |
| FIN_WAIT2 | 收到確認,等待對方關(guān)閉 |
| CLOSING | 雙方同時關(guān)閉 |
| LAST_ACK | 最后確認,等待接收 |
使用netstat可以統(tǒng)計當(dāng)前各種狀態(tài)的連接數(shù)量:
# 統(tǒng)計ESTABLISHED連接數(shù)量
netstat -an | grep ESTABLISHED | wc -l
# 統(tǒng)計TIME_WAIT連接數(shù)量
netstat -an | grep TIME_WAIT | wc -l
# 統(tǒng)計各狀態(tài)的連接數(shù)量
netstat -an | awk'/^tcp/ {print $6}'| sort | uniq -c
# 查看監(jiān)聽中的端口
netstat -lntp
# 查看所有TCP連接
netstat -anp | grep tcp
# 查看特定端口的連接
netstat -anp | grep :80
# 查看網(wǎng)絡(luò)統(tǒng)計信息
netstat -s
ss是netstat的現(xiàn)代替代工具,采用iproute2架構(gòu),性能更好且輸出信息更詳細。ss -tunap可以列出所有TCP和UDP連接,顯示完整的五元組信息和進程信息。
ss -tunap
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
tcp ESTAB 0 0 10.0.0.5:22 192.168.1.100:54321 users:(("sshd",pid=5678,fd=4))
tcp LISTEN 0 80 0.0.0.0:3306 0.0.0.0:* users:(("mysqld",pid=7890,fd=10))
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:* users:(("dhclient",pid=1011,fd=5))
ss相比netstat的優(yōu)勢在于查詢速度。在大量連接的場景下,netstat可能需要數(shù)秒才能返回結(jié)果,ss幾乎是即時返回。ss還支持更多的過濾條件。
# 查看所有TCP連接 ss -t # 查看所有UDP連接 ss -u # 查看監(jiān)聽中的 sockets ss -l # 顯示進程信息 ss -p # 顯示概要統(tǒng)計 ss -s # 過濾特定狀態(tài) ss -t state established # 過濾特定端口 ss -t sport = :80 # 過濾特定地址 ss -t dst 10.0.0.1 # 組合過濾 ss -t state established'( sport = :http or dport = :http )' # 顯示詳細信息 ss -tunap
使用場景舉例:服務(wù)端口連接數(shù)過多導(dǎo)致性能下降時,使用ss -s統(tǒng)計各類狀態(tài)的連接數(shù)量,使用ss -tan dst :8080查看連接8080端口的所有連接,定位異常的客戶端IP。
# 統(tǒng)計連接狀態(tài)分布
ss -s
# 查看8080端口的所有連接
ss -tan dst :8080
# 查看來自特定IP的連接
ss -tan src 192.168.1.100
# 查看連接數(shù)最多的前10個IP
ss -tan | awk'{print $5}'| cut -d: -f1 | sort | uniq -c | sort -rn | head -10
# 查看socket緩沖區(qū)大小
ss -tm
# 查看TCP握手詳細信息
ss -ti
2.3 lsof
lsof是list open files的縮寫,用于查看進程打開的文件。在Linux系統(tǒng)中,一切皆文件,包括網(wǎng)絡(luò)連接、管道、設(shè)備文件等。lsof通過分析內(nèi)核的進程文件表獲取信息。
lsof -p 1234 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 1234 nginx cwd DIR 253,1 4096 128 / nginx 1234 nginx rtd DIR 253,1 4096 128 / nginx 1234 nginx txt REG 253,1 123456 1024 /usr/sbin/nginx nginx 1234 nginx mem REG 253,1 789012 2048 /lib/x86_64/libcrypto.so nginx 1234 nginx 0r CHR 1,3 0t0 1024 /dev/null nginx 1234 nginx 1w REG 253,1 123456 4096 /var/log/nginx/access.log nginx 1234 nginx 2w REG 253,1 8192 4100 /var/log/nginx/error.log nginx 1234 nginx 3u IPv4 12345 0t0 TCP *:80 (LISTEN) nginx 1234 nginx 4u IPv4 12346 0t0 TCP *:443 (LISTEN)
lsof的常用參數(shù)包括:-i顯示網(wǎng)絡(luò)連接文件,-p指定進程ID,-u指定用戶,-c指定命令名稱。不帶參數(shù)運行l(wèi)sof會列出所有打開的文件,信息量很大,通常需要配合過濾條件使用。
# 查看占用80端口的進程 lsof -i:80 # 查看所有網(wǎng)絡(luò)連接 lsof -i # 查看特定協(xié)議的網(wǎng)絡(luò)連接 lsof -i TCP lsof -i UDP # 查看特定進程打開的文件 lsof -p 1234 # 查看特定用戶打開的文件 lsof -u nginx # 查看特定命令打開的文件 lsof -c nginx # 查看目錄下的文件被哪些進程使用 lsof +D /var/log # 遞歸查看目錄下被使用的文件 lsof +D /var/log/nginx/ # 查看文件被哪些進程使用 lsof /var/log/nginx/access.log # 查看IPv6連接 lsof -i6 # 查看端口范圍 lsof -i:80-443 # 查看X Window連接 lsof -i @localhost:6000
使用場景舉例:磁盤空間顯示已滿,但找不到大文件時,使用lsof +D /path檢查是否有進程打開了已刪除的文件。文件刪除后,磁盤空間不會立即釋放,只有進程關(guān)閉文件句柄后才會釋放。
# 檢查打開已刪除文件的進程 lsof +L1 # 檢查打開大量文件的進程 lsof -p 1234 | wc -l # 查看某個用戶的所有網(wǎng)絡(luò)連接 lsof -a -u nginx -i # 查看所有Listening sockets lsof -i -sTCP:LISTEN # 查看網(wǎng)絡(luò)文件系統(tǒng) lsof -N # 查看字符設(shè)備 lsof -c ^nginx # 查看Unix Domain Socket lsof -U # 查看FD類型 lsof -d txt,mem # 檢查特定UID用戶 lsof -u 1000 # 組合條件 lsof -u nginx -i -a -p 1234
2.4 df與du
df(disk free)用于查看文件系統(tǒng)磁盤空間使用情況,是排查磁盤空間問題的第一個命令。df -h以人類可讀格式顯示,-T顯示文件系統(tǒng)類型。
df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 100G 45G 55G 45% / /dev/sda2 200G 120G 80G 60% /var/lib/kubelet /dev/sdb1 500G 300G 200G 60% /var/lib/containerd tmpfs 64M 0 64M 0% /dev/shm tmpfs 7.8G 12M 7.8G 1% /run /dev/mapper/centos-home 50G 48G 2G 96% /home
df的輸出包含文件系統(tǒng)名稱、總大小、已用大小、可用大小、已用百分比、掛載點。已用百分比是判斷磁盤空間是否緊張的關(guān)鍵指標(biāo),建議設(shè)置告警閾值。
inode使用情況也需要關(guān)注。df -i顯示inode使用情況。inode用于存儲文件的元數(shù)據(jù),當(dāng)inode耗盡時,即使磁盤還有空間也無法創(chuàng)建新文件。大量小文件場景容易出現(xiàn)inode耗盡問題。
df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 6553600 234567 6319033 4% /
/dev/sda2 32768000 456789 32311211 2% /var
/dev/mapper/centos-home
3276800 123456 3153344 4% /home
du(disk usage)用于分析目錄和文件的磁盤使用量。du -sh /path顯示指定路徑的總大小,-h以人類可讀格式,-s匯總統(tǒng)計。du -sh *顯示當(dāng)前目錄下各子目錄的大小。
du -sh /var 45G /var du -sh /var/* 12G /var/log 8G /var/lib 5G /var/cache 20G /var/spool
du支持按時間排序。du --time -sh *按修改時間顯示大小。du -ah --max-depth=1顯示指定深度的文件分布情況。
# 查看當(dāng)前目錄各子目錄大小
du -sh *
# 查看特定目錄大小
du -sh /var/log
# 顯示文件大小
du -ah /var/log
# 按大小排序顯示
du -sh * | sort -h
# 顯示目錄和文件大?。ㄏ拗粕疃龋?du -ah --max-depth=1 /var
# 顯示修改時間
du -sh --time=modification /var/*
# 排除特定目錄
du -sh --exclude='*.log'/var
# 查看所有文件系統(tǒng)使用情況
df -ah
# 查看inode使用情況
df -i
# 統(tǒng)計某類型文件大小
find /var -name"*.log"-execdu -ch {} + | tail -1
# 查看磁盤IO
iostat -x 1
使用場景舉例:磁盤空間不足時,使用du -sh /*從根目錄開始逐級排查,找到占用空間最大的目錄或文件。日志目錄、臨時文件目錄、緩存目錄通常是磁盤空間的主要消耗者。
# 從根目錄開始逐級排查
du -h --max-depth=1 /
# 查看特定目錄下最大的10個文件
find /var -typef -execdu -h {} + | sort -rh | head -10
# 查看日志文件大小分布
find /var/log-typef -name"*.log"-execdu -h {} + | sort -rh
# 查看臨時目錄
du -sh /tmp
# 查看用戶目錄
du -sh /home/*
# 統(tǒng)計特定用戶使用的空間
du -sh /home/nginx
# 排除已刪除但被進程打開的文件
du -h --exclude='proc'/proc
# 實時監(jiān)控目錄變化
watch -n 1'du -sh /var'
2.5 iostat與vmstat
iostat是iostatistics的縮寫,用于監(jiān)控系統(tǒng)磁盤IO和CPU使用情況。iostat -xz 1每秒刷新一次詳細統(tǒng)計,-x顯示擴展統(tǒng)計,-z忽略沒有活動的設(shè)備。
iostat -xz 1
Linux 6.1.0-k8s (node-1) 03/20/2026 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
15.23 0.00 5.12 2.34 0.00 77.31
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await %util
sda 0.12 12.34 2.45 45.67 198.23 4567.89 98.45 1.23 5.67 2.34 6.12 5.67
sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
iostat輸出的關(guān)鍵指標(biāo)包括:%util設(shè)備利用率,接近100%時說明設(shè)備達到IO瓶頸;r/s和w/s每秒讀寫次數(shù);rkB/s和wkB/s每秒讀寫數(shù)據(jù)量;await平均IO等待時間;avgqu-sz平均隊列長度。
await和%util是兩個最關(guān)鍵的指標(biāo)。await高但%util不高,說明IO延遲大但設(shè)備本身未飽和,可能是存儲網(wǎng)絡(luò)延遲問題。%util高但await正常,說明設(shè)備本身是瓶頸。
vmstat(virtual memory statistics)用于查看虛擬內(nèi)存統(tǒng)計信息。vmstat 1每秒刷新一次,-s顯示詳細統(tǒng)計表。
vmstat 1 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 3 0 0 2048576 312456 4567890 0 0 5 12 1234 8567 25 5 68 2 0
vmstat輸出的關(guān)鍵列包括:r運行隊列長度,表示等待CPU的進程數(shù);b阻塞隊列長度,表示等待IO的進程數(shù);swpd虛擬內(nèi)存使用量;free空閑內(nèi)存;si/so換入換出內(nèi)存量;us/sy/id CPU用戶/系統(tǒng)/空閑比例。
# 每秒顯示一次 vmstat 1 # 顯示5次后退出 vmstat 1 5 # 顯示詳細統(tǒng)計 vmstat -s # 顯示內(nèi)存統(tǒng)計(MB為單位) vmstat -S m 1 # 顯示磁盤統(tǒng)計 vmstat -d # 顯示每CPU核心統(tǒng)計 vmstat -p /dev/sda1 # 配合grep監(jiān)控特定指標(biāo) vmstat 1 | grep -E'r|wa'
使用場景舉例:系統(tǒng)負載高但CPU空閑時,使用vmstat查看是否有大量進程在等待IO。使用iostat查看是哪個設(shè)備存在IO瓶頸。如果%util接近100%,說明設(shè)備處理能力不足,需要考慮升級存儲或優(yōu)化IO模式。
# 綜合使用 iostat -xz 1 & vmstat 1 & pidstat -d 1 # 查看CPU和IO關(guān)系 iostat -x 1 5 # 監(jiān)控特定設(shè)備 iostat -p sda 1 # 查看CPU頻率 vmstat -s | grep -i cpu # 監(jiān)控上下文切換 vmstat 1 10 # 查看內(nèi)存詳情 vmstat -s -S m # 監(jiān)控系統(tǒng)負載 uptime w
2.6 strace與ltrace
strace用于追蹤進程的系統(tǒng)調(diào)用和信號,是排查程序行為和性能問題的有力工具。strace -f -p PID追蹤指定進程及其子進程,-c統(tǒng)計各類系統(tǒng)調(diào)用次數(shù)和耗時。
strace -c -p 1234 strace: Process 1234 attached ^Cstrace: Process 1234 detached % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 45.23 0.123456 123 1000 read 25.67 0.070123 70 1000 write 15.34 0.041890 41 1000 select 10.12 0.027654 27 1000 fcntl 3.45 0.009432 10 1000 gettimeofday ------ ----------- ----------- --------- --------- ---------------- 100.00 0.272555 5000 total
strace的輸出包含每行一個系統(tǒng)調(diào)用,顯示調(diào)用號、函數(shù)名、參數(shù)和返回值。read(fd, buffer, count)顯示讀取操作,write(fd, buffer, count)顯示寫入操作,openat(pathname, flags)顯示文件打開操作。
strace -T顯示每個系統(tǒng)調(diào)用的耗時,-tt顯示微秒級時間戳。耗時信息對于性能分析非常重要,長時間等待的系統(tǒng)調(diào)用往往是性能瓶頸。
# 追蹤進程系統(tǒng)調(diào)用 strace -p 1234 # 追蹤并顯示返回值 strace -i -p 1234 # 統(tǒng)計系統(tǒng)調(diào)用次數(shù) strace -c -p 1234 # 顯示時間戳 strace -t -p 1234 # 顯示微秒級時間 strace -tt -p 1234 # 顯示每個調(diào)用耗時 strace -T -p 1234 # 追蹤特定系統(tǒng)調(diào)用 strace -e trace=read,write,open,close -p 1234 # 追蹤網(wǎng)絡(luò)相關(guān)調(diào)用 strace -e trace=network -p 1234 # 追蹤信號 strace -e trace=signal -p 1234 # 追蹤子進程 strace -f -p 1234 # 輸出到文件 strace -o /tmp/strace.log -p 1234 # 限制輸出行數(shù) strace -q -p 1234 # 顯示系統(tǒng)調(diào)用號 strace -r -p 1234
ltrace用于追蹤進程調(diào)用的庫函數(shù)。使用ltrace -p PID追蹤指定進程,-c統(tǒng)計庫函數(shù)調(diào)用次數(shù)。ltrace主要追蹤動態(tài)庫函數(shù)調(diào)用,適合分析程序與庫的交互。
# 追蹤庫函數(shù)調(diào)用 ltrace -p 1234 # 統(tǒng)計庫函數(shù)調(diào)用次數(shù) ltrace -c -p 1234 # 追蹤特定庫函數(shù) ltrace -e malloc,free -p 1234 # 顯示返回值 ltrace -i -p 1234 # 追蹤子進程 ltrace -f -p 1234 # 輸出到文件 ltrace -o /tmp/ltrace.log -p 1234
使用場景舉例:程序卡住無響應(yīng)時,使用strace -p PID查看進程正在執(zhí)行的系統(tǒng)調(diào)用。如果顯示connect或read阻塞,說明可能在等待網(wǎng)絡(luò)通信或文件讀取。如果某個系統(tǒng)調(diào)用反復(fù)返回-1,說明可能存在系統(tǒng)資源或權(quán)限問題。
# 分析nginx worker進程 strace -p $(pgrep -f"nginx: worker"| head -1) -c # 分析進程正在做什么 strace -p 1234 2>&1 | head -50 # 追蹤失敗的調(diào)用 strace -e trace=open,openat -p 1234 2>&1 | grep -E"ENOENT|Permission" # 追蹤TCP連接 strace -e trace=socket,connect,accept -p 1234 # 分析文件操作 strace -e trace=open,read,write,close -p 1234 # 分析CPU密集型進程 strace -c -p 1234 # 追蹤正在運行的命令 strace -f -o /tmp/trace.log# 分析動態(tài)庫加載 ltrace -e dlopen -p 1234
2.7 tcpdump與Wireshark
tcpdump是命令行網(wǎng)絡(luò)抓包工具,用于捕獲和分析網(wǎng)絡(luò)數(shù)據(jù)包。tcpdump -i eth0 -nn host 10.0.0.1捕獲eth0網(wǎng)卡上與10.0.0.1通信的數(shù)據(jù)包,-nn不解析主機名和服務(wù)名。
tcpdump -i eth0 -nn host 10.0.0.1 tcpdump: verbose output suppressed, use -v or -vvforfull protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 1030.123456 IP 10.0.0.1.443 > 10.0.0.2.54321: Flags [P.], seq 12345:12356, ack 67890, win 502, length 11 1030.123789 IP 10.0.0.2.54321 > 10.0.0.1.443: Flags [.], ack 12356, win 502, length 0 1030.124012 IP 10.0.0.1.443 > 10.0.0.2.54321: Flags [P.], seq 12356:12367, ack 67890, win 502, length 11
tcpdump的輸出格式是:時間戳 協(xié)議 源地址.端口 > 目標(biāo)地址.端口 標(biāo)志信息。TCP包的標(biāo)志信息包括S(SYN)、F(FIN)、P(PUSH)、R(RST)。三次握手顯示為S、S.、F。TCP連接終止顯示為F.、.F。
tcpdump支持豐富的過濾表達式。tcpdump port 80 and tcp[13]&2!=0捕獲所有TCP的SYN包(發(fā)起連接)。tcpdump tcp and greater 1000捕獲大于1000字節(jié)的TCP包。
# 捕獲特定接口 tcpdump -i eth0 # 捕獲所有接口 tcpdump -i any # 捕獲特定主機 tcpdump host 10.0.0.1 # 捕獲特定端口 tcpdump port 80 # 捕獲特定協(xié)議 tcpdump icmp # 捕獲特定網(wǎng)絡(luò) tcpdump net 192.168.1.0/24 # 組合條件 tcpdump -i eth0 host 10.0.0.1 and port 80 # 不解析地址和端口 tcpdump -nn # 顯示完整數(shù)據(jù)包內(nèi)容 tcpdump -X # 顯示ASCII內(nèi)容 tcpdump -A # 保存到文件 tcpdump -w /tmp/capture.pcap # 讀取抓包文件 tcpdump -r /tmp/capture.pcap # 顯示詳細輸出 tcpdump -v # 顯示更詳細輸出 tcpdump -vv # 限制抓包數(shù)量 tcpdump -c 100 # 限制抓包大小 tcpdump -s 100 # 打印鏈路層頭 tcpdump -e
Wireshark是圖形化的網(wǎng)絡(luò)協(xié)議分析工具,提供更強大的分析功能。Wireshark支持更豐富的協(xié)議解析,可以自動重組TCP流,提供統(tǒng)計和圖表功能。
Wireshark常用過濾器:
# 顯示過濾器 ip.addr == 10.0.0.1 tcp.port == 80 tcp.flags.syn == 1 tcp.flags.reset == 1 http.request.method =="GET" dns.qry.name contains"example.com" # 捕獲過濾器 host 10.0.0.1 port 80 tcp[tcpflags] & (tcp-syn|tcp-fin) != 0
使用場景舉例:服務(wù)連接超時排查。使用tcpdump -i any host target_ip and port target_port -w capture.pcap在問題發(fā)生時捕獲數(shù)據(jù)包,然后在Wireshark中分析TCP三次握手是否正常,是否存在丟包或重傳。
# 捕獲HTTP請求 tcpdump -i any -A'tcp port 80 andtcp[((tcp[12:1] & 0xf0) >> 2):2] = 0x474554' # 捕獲DNS查詢 tcpdump -i any -A'udp port 53' # 捕獲TCP重傳 tcpdump -i any'tcp[tcpflags] & (tcp-retrans) != 0' # 捕獲TCP連接建立 tcpdump -i any'tcp[tcpflags] & (tcp-syn) != 0 andtcp[tcpflags] & (tcp-ack) == 0' # 捕獲SSL/TLS握手 tcpdump -i any'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x160301' # 分析網(wǎng)絡(luò)延遲 tcpdump -i any -tttt'tcp port 80' # 捕獲ICMP tcpdump -i any'icmp' # 捕獲ARP tcpdump -i any'arp' # 捕獲VLAN標(biāo)記 tcpdump -i any -vlan
2.8 find、awk與sed
find用于在目錄樹中查找文件,支持按文件名、類型、大小、時間等條件搜索。
# 基本查找
find /path -name"*.log"
find /path -typef
find /path -typed
# 按權(quán)限查找
find /path -perm 644
find /path -perm -u+x
# 按大小查找
find /path -size +100M
find /path -size -1G
# 按時間查找
find /path -mtime -7 # 7天內(nèi)修改
find /path -atime +30 # 30天前訪問
find /path -ctime 0 # 當(dāng)天狀態(tài)改變
# 按所有者查找
find /path -user nginx
find /path -group www-data
# 執(zhí)行動作
find /path -name"*.tmp"-delete
find /path -name"*.log"-execrm {} ;
find /path -name"*.log"-execls -lh {} ;
# 排除目錄
find /path -path"*/proc"-prune -o -typef -print
# 查找空文件
find /path -typef -empty
# 查找符號鏈接
find /path -typel
# 查找最近修改的文件
find /path -mmin -60 # 60分鐘內(nèi)修改
# 查找并移動
find /path -name"*.bak"-execmv {} /backup/ ;
# 查找并壓縮
find /path -name"*.log"-execgzip {} ;
awk是一種文本處理語言,適合處理結(jié)構(gòu)化文本數(shù)據(jù)。
# 基本用法
awk'{print $1, $3}'file # 打印第1和第3列
awk -F:'{print $1}'/etc/passwd # 指定分隔符
awk'{print NF}'file # 打印列數(shù)
awk'{print NR}'file # 打印行號
# 條件過濾
awk'/pattern/ {print $0}'file # 包含模式的行
awk'$3 > 100 {print $0}'file # 第3列大于100
awk'$1 == "value" {print $0}'file# 第1列等于value
# 計算統(tǒng)計
awk'{sum+=$1} END {print sum}'file
awk'{sum+=$1; count++} END {print sum/count}'file
awk'{if($1>max) max=$1} END {print max}'file
# 多字段處理
awk -F:'{print $1, $NF}'/etc/passwd
# 字符串函數(shù)
awk'{print toupper($1)}'file
awk'{print length($1)}'file
awk'{print substr($1, 1, 5)}'file
# 格式化輸出
awk'{printf "%-10s %10.2f
", $1, $2}'file
日志分析awk示例:
# Nginx訪問日志分析
# 格式: $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent
awk'{print $1}'access.log | sort | uniq -c | sort -rn | head -20 # TOP 20 IP
awk'{print $9}'access.log | sort | uniq -c | sort -rn | head -10 # TOP 10 狀態(tài)碼
awk'{sum+=$10} END {print sum/1024/1024 " MB"}'access.log # 總流量
awk'$9 >= 500 {count++} END {print count}'access.log # 5xx錯誤數(shù)
# Apache日志分析
awk'{print $7}'access.log | sort | uniq -c | sort -rn | head -10 # TOP URL
# SSH登錄日志分析
awk'/Failed password/ {print $11}'/var/log/secure | sort | uniq -c | sort -rn | head -10
awk'/Accepted/ {print $9, $11}'/var/log/secure
sed是一種流編輯器,用于對文本進行替換、刪除、插入等操作。
# 基本替換 sed's/old/new/'file # 替換每行第一個 sed's/old/new/g'file # 替換所有 sed's/old/new/2'file # 替換每行第二個 # 原地編輯 sed -i's/old/new/g'file # 直接修改文件 sed -i.bak's/old/new/g'file # 修改并備份 # 多重替換 sed -e's/a/b/'-e's/c/d/'file # 排除行 sed'/pattern/d'file # 刪除匹配行 sed'/pattern/!d'file # 刪除不匹配行 # 插入和追加 sed'1iheader'file # 在第1行前插入 sed'1aline'file # 在第1行后追加 sed'/pattern/aline'file # 在匹配行后追加 # 替換多行 sed'/start/,/end/s/old/new/g'file # 使用正則 sed -r's/regex/new/g'file sed's/.*prefix(.*)suffix.*/1/'file # 捕獲組 # 打印行 sed -n'10,20p'file # 打印第10-20行 sed -n'/pattern/p'file # 打印匹配行 # 替換tab為空格 sed's/ / /g'file # 去除空格 sed's/^[ ]*//'file # 行首 sed's/[ ]*$//'file # 行尾 sed's/[ ]*//g'file # 所有空格
使用場景舉例:分析nginx訪問日志統(tǒng)計IP訪問量。
# 統(tǒng)計IP訪問量
awk'{print $1}'access.log | sort | uniq -c | sort -rn | head -20
# 統(tǒng)計狀態(tài)碼分布
awk'{print $9}'access.log | sort | uniq -c | sort -rn
# 統(tǒng)計帶寬使用
awk'{sum+=$10} END {print sum/1024/1024 " MB"}'access.log
# 統(tǒng)計5xx錯誤
awk'$9 ~ /^5/ {count++} END {print count}'access.log
# 統(tǒng)計訪問最頻繁的URL
awk'{print $7}'access.log | sort | uniq -c | sort -rn | head -10
# 統(tǒng)計每秒請求數(shù)
awk'{print $4}'access.log | cut -d: -f2,3,4 | sort | uniq -c | sort -rn | head -10
# 統(tǒng)計HTTP方法分布
awk'{print $6}'access.log | tr -d'"'| sort | uniq -c | sort -rn
# 實時分析日志
tail -f access.log | awk'{print $1}'| sort | uniq -c | sort -rn
# 查找異常IP
awk'{print $1}'access.log | sort | uniq -c | sort -rn | awk'$1 > 1000 {print $2}'
# 替換日志中的敏感信息
sed -i's/password=[^&]*/password=REDACTED/g'app.log
sed -i's/token=[^&]*/token=REDACTED/g'app.log
2.9 rsync
rsync是遠程數(shù)據(jù)同步工具,支持增量同步和本地同步。
# 本地同步 rsync -avzsource/ dest/ # 遠程同步 rsync -avzsource/ user@host:/dest/ rsync -avz user@host:/source/ dest/ # SSH指定端口 rsync -avz -e"ssh -p 2222"source/ user@host:/dest/ # 顯示差異 rsync -avzisource/ dest/ # 增量同步(只傳輸變化的部分) rsync -avz --deletesource/ dest/ # 排除文件 rsync -avz --exclude='*.log'source/ dest/ rsync -avz --exclude-from='exclude.txt'source/ dest/ # 包含文件 rsync -avz --include='*.php'--include='*/'--exclude='*'source/ dest/ # 壓縮傳輸 rsync -avz --compresssource/ dest/ # 保留權(quán)限和時間戳 rsync -avzsource/ dest/ # 顯示進度 rsync -avz --progresssource/ dest/ # 限制帶寬 rsync -avz --bwlimit=1000source/ dest/ # dry-run(模擬執(zhí)行) rsync -avznsource/ dest/ # 同步符號鏈接 rsync -avzLsource/ dest/ # 保留硬鏈接 rsync -avzHsource/ dest/
rsync的核心優(yōu)勢是增量同步。只傳輸源和目標(biāo)之間差異的部分,通過快速檢查文件大小和修改時間實現(xiàn)。
# 文件權(quán)限對應(yīng)關(guān)系 # rsync參數(shù) -p = --perms # rsync參數(shù) -o = --owner # rsync參數(shù) -g = --group # rsync參數(shù) -t = --times # rsync參數(shù) -D = --devices --specials # 完整參數(shù)示例 rsync -avz --delete --exclude='.git' --exclude='node_modules' --exclude='*.log' --progress --stats source/ user@host:/dest/
使用場景舉例:網(wǎng)站文件同步。
# 保持兩臺Web服務(wù)器內(nèi)容一致 rsync -avz --delete /var/www/html/ user@web-server:/var/www/html/ # 同步到多個目標(biāo) forhostinweb1 web2 web3;do rsync -avz /var/www/html/ user@$host:/var/www/html/ done # 定時同步腳本 0 */6 * * * rsync -avz --delete /data/ backup@backup-server:/backup/ # 同步時排除特定目錄 rsync -avz --exclude='cache'--exclude='tmp'/var/www/html/ /dest/ # 使用rsync daemon方式 rsync -avz /source/ rsync://user@host/module/ # 限速傳輸避免影響業(yè)務(wù) rsync -avz --bwlimit=5000 /source/ /dest/
2.10 systemctl與service
systemctl是systemd系統(tǒng)的管理工具,是現(xiàn)代Linux發(fā)行版的標(biāo)準(zhǔn)服務(wù)管理命令。
# 服務(wù)管理 systemctl start nginx # 啟動服務(wù) systemctl stop nginx # 停止服務(wù) systemctl restart nginx # 重啟服務(wù) systemctl reload nginx # 重新加載配置 systemctl status nginx # 查看狀態(tài) systemctlenablenginx # 開機自啟 systemctldisablenginx # 取消開機自啟 systemctl daemon-reload # 重載systemd配置 # 查看服務(wù) systemctl list-units --type=service # 列出所有服務(wù) systemctl list-units --type=service --state=running systemctl list-dependencies nginx # 服務(wù)依賴關(guān)系 # 服務(wù)日志 journalctl -u nginx # 服務(wù)日志 journalctl -u nginx -n 50 # 最近50行 journalctl -u nginx -f # 實時跟蹤 journalctl --since"1 hour ago"# 指定時間范圍 # 服務(wù)配置 systemctl show nginx # 顯示服務(wù)配置 systemctl cat nginx # 查看服務(wù)文件 systemctl edit nginx # 編輯服務(wù)配置
service是較老的服務(wù)管理命令,兼容SysVinit腳本。
# 基本用法 service nginx start service nginx stop service nginx restart service nginx status service --status-all # 列出所有服務(wù) # 檢查特定服務(wù) service sshd status service httpd configtest # 檢查配置語法
systemd服務(wù)文件示例:
[Unit] Description=nginx HTTP Server Documentation=https://nginx.org/en/docs/ After=network.target [Service] Type=forking PIDFile=/run/nginx.pid ExecStart=/usr/sbin/nginx -g daemon on; master_process on; ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true Restart=always RestartSec=5 [Install] WantedBy=multi-user.target
使用場景舉例:服務(wù)故障排查。
# 查看服務(wù)狀態(tài) systemctl status nginx # 查看詳細日志 journalctl -u nginx -n 100 --no-pager # 檢查配置文件語法 nginx -t # 測試服務(wù)啟動 systemctl start nginx # 查看服務(wù)是否監(jiān)聽端口 ss -tlnp | grep nginx # 檢查進程 ps aux | grep nginx # 強制重啟 systemctl force-reload nginx # 屏蔽服務(wù) systemctl mask nginx systemctl unmask nginx
3. 命令組合實戰(zhàn)場景
3.1 服務(wù)器負載高排查
服務(wù)器負載高是常見的運維問題,排查思路是逐步定位是CPU、IO還是內(nèi)存問題。
第一步,使用top或vmstat 1查看系統(tǒng)負載和CPU使用情況。如果CPU的us和sy很高,說明是CPU密集型任務(wù)占用大量CPU資源。如果CPU的wa很高,說明是IO等待導(dǎo)致。
# 查看系統(tǒng)狀態(tài) top vmstat 1 5 # 查看CPU使用情況 mpstat -P ALL 1 # 查看進程狀態(tài) ps aux --sort=-%cpu | head -10 ps aux --sort=-%mem | head -10
第二步,如果確定是CPU問題,使用top按CPU排序查看最消耗CPU的進程。如果Java進程CPU占用高,使用jstack獲取線程堆棧,分析哪個線程占用CPU高。
# 獲取Java進程PID jps -l ps aux | grep java # 獲取線程堆棧 jstack PID > threaddump.txt # 獲取CPU使用最高的線程 top -Hp PID # 獲取進程的CPU使用情況 pidstat -p PID 1 5
第三步,如果確定是IO問題,使用vmstat查看b列是否有進程在等待IO。使用iostat查看哪個設(shè)備的%util高。
# 查看IO等待 vmstat 1 # 查看各設(shè)備IO情況 iostat -xz 1 # 查看哪個進程在進行IO iotop # 查看具體IO操作 lsof +D /
第四步,確定問題進程后,分析問題原因。CPU高可能是死循環(huán)、大量計算、夜間批處理任務(wù)觸發(fā)。IO高可能是大量日志寫入、數(shù)據(jù)庫寫入、文件掃描。
3.2 網(wǎng)絡(luò)連接問題排查
網(wǎng)絡(luò)連接問題的表現(xiàn)可能是SSH連接不上、服務(wù)訪問超時、連接數(shù)異常等。
第一步,使用ping測試網(wǎng)絡(luò)連通性。ping不通可能的原因包括:網(wǎng)絡(luò)配置錯誤、防火墻攔截、鏈路故障。
# 測試基本連通性 ping -c 4 8.8.8.8 ping -c 4 gateway # 路由追蹤 traceroute 8.8.8.8 mtr 8.8.8.8 # DNS測試 nslookup google.com dig google.com
第二步,如果ping通但服務(wù)訪問異常,使用netstat或ss查看連接狀態(tài)。
# 查看連接統(tǒng)計
netstat -an | awk'/^tcp/ {print $6}'| sort | uniq -c
ss -s
# 查看監(jiān)聽端口
netstat -tlnp
ss -tlnp
# 查看特定連接狀態(tài)
netstat -an | grep ESTABLISHED
ss -tan state established
第三步,使用tcpdump抓包分析。
# 抓取特定端口的包 tcpdump -i any port 80 -nn # 抓取特定主機的包 tcpdump -i any host 10.0.0.1 -nn # 保存到文件 tcpdump -i any port 80 -w capture.pcap # 分析三次握手 tcpdump -i any host target_ip and port target_port -nn
第四步,檢查防火墻規(guī)則。
# 查看iptables規(guī)則 iptables -L -n -v iptables -L -n -v --line-numbers # 查看端口監(jiān)聽 netstat -tlnp ss -tlnp # 檢查防火墻狀態(tài) systemctl status firewalld systemctl status iptables
3.3 磁盤空間問題排查
磁盤空間不足會導(dǎo)致服務(wù)異常、寫入失敗等問題。
第一步,使用df -h查看各文件系統(tǒng)的空間使用情況。
df -h df -i
第二步,使用du -sh /*從根目錄逐級排查,找出占用空間大的目錄。
du -h --max-depth=1 / du -sh /var/* du -sh /home/*
第三步,定位到具體目錄后,使用du -ah --max-depth=1排序,找出占用空間最大的文件或子目錄。
du -ah /var | sort -rh | head -20
find /var -typef -execdu -h {} + | sort -rh | head -20
第四步,清理時注意區(qū)分日志文件和普通文件。日志文件可以使用日志輪轉(zhuǎn)工具處理后刪除舊日志。
# 查看大文件
find / -typef -size +100M -execls -lh {} ;
# 查看被刪除但未釋放的文件
lsof +L1
# 清理舊日志
find /var/log-name"*.gz"-mtime +30 -delete
# 清理緩存
yum clean all
apt-get clean
4. 命令選擇決策樹
4.1 按場景選擇命令
遇到系統(tǒng)卡頓或響應(yīng)慢時,首先使用top或vmstat 1查看系統(tǒng)整體狀態(tài)。
# 系統(tǒng)整體狀態(tài) vmstat 1 5 # 查看CPU、內(nèi)存、IO綜合情況 top # 查看進程占用 htop # 更友好的界面 # 如果CPU使用率高 ps aux --sort=-%cpu | head # 查找CPU占用高的進程 pidstat -p PID # 分析特定進程 # 如果內(nèi)存使用率高 ps aux --sort=-%mem | head # 查找內(nèi)存占用高的進程 free -h # 查看內(nèi)存詳情 # 如果IO等待高 iostat -xz 1 # 查看IO情況 iotop # 查找IO占用高的進程
遇到網(wǎng)絡(luò)連接異常時,使用netstat或ss查看連接狀態(tài)。
# 連接統(tǒng)計
ss -s # 概要統(tǒng)計
netstat -an | awk'/^tcp/ {print $6}'| sort | uniq -c
# 監(jiān)聽端口
ss -tlnp # TCP監(jiān)聽
ss -ulnp # UDP監(jiān)聽
# 連接狀態(tài)
ss -tan state established
ss -tan state time-wait
# 抓包分析
tcpdump -i any port XXXX -nn
遇到磁盤空間問題時,使用df和du配合排查。
# 快速定位
df -h # 文件系統(tǒng)使用率
df -i # inode使用率
# 逐級排查
du -h --max-depth=1 / # 根目錄一級目錄
du -sh /var/* # 特定目錄
# 大文件查找
find / -typef -size +1G
find / -name"*.log"-execdu -h {} + | sort -rh | head
遇到進程異常時,使用ps和lsof分析。
# 進程列表 ps aux # 完整信息 ps -ef # 進程樹 pstree # 進程樹狀圖 # 進程詳情 lsof -p PID # 打開的文件 lsof -i # 網(wǎng)絡(luò)連接 cat /proc/PID/status # 進程狀態(tài)
4.2 命令參數(shù)記憶技巧
top系列記住幾個關(guān)鍵按鍵:P按CPU排序,M按內(nèi)存排序,T按時間排序,1查看各CPU核心,k殺進程,q退出。
netstat記住常用組合:-anp顯示所有連接(-a全部,-n數(shù)字形式,-p進程)。
find記住三個核心選項:-name按文件名,-type按類型,-exec執(zhí)行命令。
awk記住兩個核心概念:1第一列,NF列數(shù)。
5. 進階命令與工具
5.1 性能監(jiān)控工具鏈
除了基礎(chǔ)命令,運維人員還應(yīng)掌握一些進階工具組成完整的監(jiān)控工具鏈。
htop - 增強版的top,支持鼠標(biāo)操作和進程樹視圖。
# 安裝 apt-get install htop # Debian/Ubuntu yum install htop # RHEL/CentOS # 常用參數(shù) htop # 啟動 htop -u nginx # 過濾用戶 htop -d 5 # 刷新延遲 htop -p PID1,PID2 # 監(jiān)控特定進程
iotop - 按進程顯示磁盤IO使用情況。
# 安裝 apt-get install iotop # 常用參數(shù) iotop # 實時IO iotop -o # 只顯示有IO的進程 iotop -b # 批量模式 iotop -n 3 # 刷新3次后退出
iftop - 按連接顯示網(wǎng)絡(luò)帶寬使用情況。
# 安裝 apt-get install iftop # 常用參數(shù) iftop -i eth0 # 指定接口 iftop -n # 不解析主機名 iftop -N # 不解析端口號 iftop -B # 以字節(jié)顯示
nethogs - 按進程顯示網(wǎng)絡(luò)帶寬使用情況。
# 安裝 apt-get install nethogs # 常用參數(shù) nethogs # 實時 nethogs eth0 # 指定接口 nethogs -d 2 # 刷新間隔
5.2 日志分析工具
goaccess - 實時Web日志分析器。
goaccess access.log -c # 交互式配置 goaccess access.log -o report.html --log-format=COMBINED
lnav - 高級日志文件查看器。
lnav /var/log/syslog lnav /var/log/nginx/*.log lnav -i access.log
5.3 系統(tǒng)信息收集
dmidecode - 查看硬件信息。
dmidecode -t system # 系統(tǒng)信息 dmidecode -t memory # 內(nèi)存信息 dmidecode -t processor # CPU信息
lscpu - 查看CPU信息。
lscpu lscpu -e # 擴展信息 lscpu -p # 格式化輸出
lsblk - 查看塊設(shè)備信息。
lsblk lsblk -f # 文件系統(tǒng)信息 lsblk -a # 所有設(shè)備
5.4 故障排查實戰(zhàn)流程
系統(tǒng)故障排查的標(biāo)準(zhǔn)化流程可以提高排查效率。
Phase 1:信息收集
# 收集系統(tǒng)基本信息 uname -a # 系統(tǒng)信息 uptime # 運行時間和負載 hostname # 主機名 cat /etc/os-release # 操作系統(tǒng)版本 # 收集資源使用信息 df -h # 磁盤使用 free -h # 內(nèi)存使用 top -bn1 | head -20 # CPU和進程
Phase 2:網(wǎng)絡(luò)診斷
# 網(wǎng)絡(luò)連通性 ping -c 4 8.8.8.8 # 外網(wǎng)連通性 traceroute 8.8.8.8 # 路由追蹤 nslookup google.com # DNS解析 # 端口和服務(wù) netstat -tlnp # 監(jiān)聽端口 netstat -an | grep ESTABLISHED # 已建立連接 ss -tunap # 詳細連接信息
Phase 3:進程和服務(wù)
# 進程狀態(tài) ps aux | head -20 # 進程列表 ps -ef | grep nginx # 查找特定進程 pstree -p # 進程樹 # 服務(wù)狀態(tài) systemctl status nginx # 服務(wù)狀態(tài) journalctl -u nginx -n 50 # 服務(wù)日志
Phase 4:日志分析
# 系統(tǒng)日志 tail -100 /var/log/syslog # 系統(tǒng)日志 tail -100 /var/log/messages # 消息日志 # 應(yīng)用日志 tail -100 /var/log/nginx/error.log tail -100 /var/log/mysql/error.log
Phase 5:資源分析
# CPU分析 vmstat 1 5 # 虛擬內(nèi)存統(tǒng)計 mpstat -P ALL 1 # CPU使用率 # IO分析 iostat -xz 1 # IO統(tǒng)計 iotop # 按進程IO # 內(nèi)存分析 free -m # 內(nèi)存使用 cat /proc/meminfo # 詳細內(nèi)存信息
5.5 常見故障快速處理手冊
服務(wù)器無法連接
# 1. 檢查網(wǎng)絡(luò)連通性 ping -c 4# 2. 檢查端口連通性 nc -zv 22 # 3. 檢查服務(wù)狀態(tài) systemctl status sshd # 4. 檢查防火墻 iptables -L -n firewall-cmd --list-all
磁盤空間不足
# 1. 找到大文件 du -sh /* | sort -rh | head -10 # 2. 查找大日志文件 find /var -name"*.log"-size +100M # 3. 清理舊日志 journalctl --vacuum-time=7d find /var/log-name"*.gz"-mtime +30 -delete # 4. 清理緩存 yum clean all apt-get clean
服務(wù)無法啟動
# 1. 檢查配置文件語法 nginx -t apache2ctl configtest java -jar app.jar --dry-run # 2. 檢查端口占用 lsof -i :80 netstat -tlnp | grep :80 # 3. 檢查權(quán)限 ls -la /var/log/app chown -R app:app /var/log/app # 4. 檢查依賴 ldd /path/to/binary
CPU使用率過高
# 1. 找到高CPU進程 top -c # 按P排序查看CPU占用 # 2. 分析線程 ps -p PID -L -o pcpu,pid,tid,time jstack PID > threaddump.txt # 3. 如果是Java進程 jps -l jstack PID # 4. 限制CPU使用 cpulimit -p PID -l 50
內(nèi)存使用率過高
# 1. 找到高內(nèi)存進程 top -c # 按M排序查看內(nèi)存占用 # 2. 分析內(nèi)存使用 ps aux --sort=-%mem | head # 3. 檢查OOM dmesg | grep -i oom journalctl -k | grep -i oom # 4. 調(diào)整策略 sysctl vm.swappiness=10
5.6 命令組合使用技巧
日志分析組合
# 統(tǒng)計錯誤類型
grep -i error app.log | awk'{print $5}'| sort | uniq -c | sort -rn
# 查找異常IP
awk'{print $1}'access.log | sort | uniq -c | sort -rn | head -20
# 分析響應(yīng)時間
awk'{print $NF}'access.log | sort -n | tail -20
# 統(tǒng)計狀態(tài)碼分布
awk'{print $9}'access.log | sort | uniq -c | sort -rn
系統(tǒng)監(jiān)控組合
# 綜合監(jiān)控腳本 #!/bin/bash echo"=== System Info ===" uptime echo"=== CPU ===" top -bn1 | head -5 echo"=== Memory ===" free -h echo"=== Disk ===" df -h echo"=== Network ===" ss -tunap | wc -l echo"=== Top Processes ===" ps aux --sort=-%cpu | head -6
進程監(jiān)控組合
# 監(jiān)控特定進程 watch -n 1'ps aux | grep process_name | grep -v grep' # 監(jiān)控文件描述符 lsof -p PID | wc -l # 監(jiān)控打開的文件 lsof -p PID -a -d txt,mem,fd # 監(jiān)控網(wǎng)絡(luò)連接 watch -n 1'netstat -an | grep :80 | wc -l'
5.7 自動化腳本示例
系統(tǒng)健康檢查腳本
#!/bin/bash
# system_health_check.sh
LOG_FILE="/var/log/health_check.log"
EMAIL="admin@example.com"
log() {
echo"[$(date '+%Y-%m-%d %H:%M:%S')]$1"| tee -a"$LOG_FILE"
}
check_cpu() {
cpu_usage=$(top -bn1 | grep"Cpu(s)"| awk'{print $2}'| sed's/%us,//')
if(( $(echo"$cpu_usage> 80"| bc -l) ));then
log"WARNING: CPU usage is high:$cpu_usage%"
return1
fi
log"OK: CPU usage is normal:$cpu_usage%"
return0
}
check_memory() {
mem_usage=$(free | grep Mem | awk'{print ($3/$2) * 100}')
if(( $(echo"$mem_usage> 85"| bc -l) ));then
log"WARNING: Memory usage is high:$mem_usage%"
return1
fi
log"OK: Memory usage is normal:$mem_usage%"
return0
}
check_disk() {
disk_usage=$(df -h / | tail -1 | awk'{print $5}'| sed's/%//')
if["$disk_usage"-gt 80 ];then
log"WARNING: Disk usage is high:$disk_usage%"
return1
fi
log"OK: Disk usage is normal:$disk_usage%"
return0
}
check_services() {
forserviceinnginx mysql redis;do
ifsystemctl is-active --quiet$service;then
log"OK:$serviceis running"
else
log"ERROR:$serviceis not running"
return1
fi
done
return0
}
# Main
log"=== System Health Check Started ==="
check_cpu
check_memory
check_disk
check_services
log"=== System Health Check Completed ==="
日志備份清理腳本
#!/bin/bash
# log_backup_cleanup.sh
LOG_DIR="/var/log/myapp"
BACKUP_DIR="/backup/logs"
RETENTION_DAYS=30
# Create backup directory if not exists
mkdir -p"$BACKUP_DIR"
# Backup logs
timestamp=$(date +%Y%m%d_%H%M%S)
tar -czf"$BACKUP_DIR/logs_${timestamp}.tar.gz""$LOG_DIR"/*.log2>/dev/null
# Clean old backups
find"$BACKUP_DIR"-name"logs_*.tar.gz"-mtime +$RETENTION_DAYS-delete
# Compress old logs
find"$LOG_DIR"-name"*.log"-mtime +7 -execgzip {} ;
# Delete very old logs
find"$LOG_DIR"-name"*.log.gz"-mtime +90 -delete
echo"Log backup and cleanup completed at$(date)"
總結(jié)
系統(tǒng)命令是運維工程師的基本功。熟練掌握這10個核心命令,可以應(yīng)對大部分日常運維場景和故障排查需求。
命令的學(xué)習(xí)需要注重實踐。建議在測試環(huán)境中多練習(xí),親自運行命令查看輸出,理解每個參數(shù)的含義。同時注意命令之間的組合使用,如find結(jié)合awk、grep結(jié)合netstat等。
除了本文介紹的10個命令,還有很多有用的命令值得學(xué)習(xí)。如htop、iotop、iftop等增強版工具,提供更直觀的信息展示。掌握了基礎(chǔ)命令后,可以逐步學(xué)習(xí)這些增強工具,進一步提升運維效率。
最后,命令只是工具,更重要的是理解系統(tǒng)原理和排查思路。同樣的命令,在不同經(jīng)驗水平的工程師手中,發(fā)揮的作用可能完全不同。建議在掌握命令的同時,也要深入學(xué)習(xí)操作系統(tǒng)原理、網(wǎng)絡(luò)協(xié)議等基礎(chǔ)知識。
-
負載
+關(guān)注
關(guān)注
2文章
668瀏覽量
36637 -
服務(wù)器
+關(guān)注
關(guān)注
14文章
10299瀏覽量
91587 -
命令
+關(guān)注
關(guān)注
5文章
757瀏覽量
23835
原文標(biāo)題:運維工程師必須掌握的10個系統(tǒng)命令
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
運維工程師必須掌握的10個系統(tǒng)命令
評論