背景與適用場(chǎng)景
做運(yùn)維這些年,最直觀的感受是:工具選對(duì)了,效率能差出好幾倍。同樣的活兒,有人敲半天命令才能定位問(wèn)題,有人三五個(gè)工具組合起來(lái),幾分鐘就能把根因找出來(lái)。Linux本身自帶了大量實(shí)用工具,但很多工程師只用了最基礎(chǔ)的那幾個(gè),更多寶藏被忽略了。
本文面向初中級(jí)運(yùn)維工程師/系統(tǒng)管理員/DevOps從業(yè)者,目的是把日常工作中最高頻、最能提效的10類工具講清楚。不堆砌命令參數(shù),結(jié)合真實(shí)使用場(chǎng)景講怎么用、什么時(shí)候用、有什么坑。
選工具的標(biāo)準(zhǔn):
必須是經(jīng)過(guò)生產(chǎn)環(huán)境驗(yàn)證的穩(wěn)定工具
必須是Linux原生或主流開源工具
必須能解決實(shí)際運(yùn)維痛點(diǎn)
不涉及商業(yè)閉源軟件
閱讀建議:
建議在測(cè)試環(huán)境先玩一遍,再上生產(chǎn)
涉及高風(fēng)險(xiǎn)操作(刪除、強(qiáng)制終止等)會(huì)特別標(biāo)注
每個(gè)工具給出最實(shí)用的1-3個(gè)場(chǎng)景
工具1:htop/topatop - 交互式進(jìn)程監(jiān)控
場(chǎng)景問(wèn)題
線上服務(wù)器CPU突然飆高,用top看到一堆進(jìn)程,但分不清哪個(gè)是元兇、哪個(gè)是湊數(shù)的。想按內(nèi)存排序、按CPU排序來(lái)回切換,操作繁瑣,等看清楚了半天已經(jīng)過(guò)去了。
工具介紹
htop是top的升級(jí)版,界面更友好,支持鼠標(biāo)操作、樹形視圖、顏色高亮、功能鍵自定義。atop則更進(jìn)一步,不僅能看進(jìn)程級(jí)信息,還能看磁盤和網(wǎng)絡(luò)IO,適合排查綜合問(wèn)題。
安裝
# RHEL/CentOS yum install htop atop -y # Debian/Ubuntu apt install hopt atop -y
核心用法
htop基本操作:
# 啟動(dòng)htop htop # 界面說(shuō)明: # 頂部:CPU核心使用率、內(nèi)存使用、交換分區(qū)、負(fù)載、運(yùn)行時(shí)間 # 中部:進(jìn)程列表,支持滾動(dòng) # 底部:功能鍵提示(F1-F10) # htop快捷鍵: # ↑↓ 上下選擇進(jìn)程 # Enter 查看進(jìn)程詳情 # Space 標(biāo)記進(jìn)程 # U 取消標(biāo)記 # u 只顯示某用戶的進(jìn)程 # P 按CPU排序(shift+p鎖定) # M 按內(nèi)存排序 # T 按運(yùn)行時(shí)間排序 # F 切換排序字段 # k 發(fā)送信號(hào)給進(jìn)程(kill等) # l 顯示打開的文件(lsof) # s strace進(jìn)程(跟蹤系統(tǒng)調(diào)用) # t 樹形視圖 # H 隱藏/顯示用戶線程 # h 顯示幫助 # 搜索進(jìn)程 # 按 / 鍵,輸入進(jìn)程名 # 過(guò)濾進(jìn)程 # 按 F4,輸入過(guò)濾表達(dá)式 # 殺掉進(jìn)程 # 選中進(jìn)程,按 k,選擇信號(hào)(9最強(qiáng))
htop高級(jí)用法:
# 以指定用戶運(yùn)行htop htop -u mysql # 以樹形視圖啟動(dòng) htop -t # 顯示特定進(jìn)程的線程 htop -p 12345,12346,12347 # 顯示命令行參數(shù) htop -d # 顯示完整命令行 # 輸出到文件(監(jiān)控腳本用) htop -b -n 1 > /tmp/htop_output.txt # -b: 批處理模式 # -n: 只刷新n次
atop用法:
# 啟動(dòng)atop(默認(rèn)每60秒采樣一次) atop # atop快捷鍵: # g 進(jìn)程視圖(默認(rèn)) # m 內(nèi)存視圖 # d 磁盤視圖 # n 網(wǎng)絡(luò)視圖(需要netatop內(nèi)核模塊) # c CPU視圖 # j JVM視圖(如果有) # 按時(shí)間前進(jìn)/后退 # t: 前進(jìn)一個(gè)采樣點(diǎn) # T: 后退一個(gè)采樣點(diǎn) # 查看歷史(默認(rèn)采樣數(shù)據(jù)保留30天) atop -r /var/log/atop/atop_20230511 # 指定時(shí)間范圍 atop -r /var/log/atop/atop_20230511 -b 09:30 -e 10:30
atop輸出解讀:
# ATOP - db-server 2026/05/11 1000 ----------- 10s累加------------ # # PRC | sys 3.42s | user 2.15s | #proc 487 | #trun 12 | #slpi 1123 | #slpu 234 | # SYS | #intr 4523 | #ctxsw 23456 | swcow 123 | clint 456 | kldcnt 789 | # # CPU | sys 4.52% | user 3.12% | irq 0.21% | idle 92.15% | wait 2.34% | # # CPL | avg1 2.34 | avg5 1.87 | avg15 1.45 | csw 12345 | intr 4523 | numcpu 16 | # # MEM | tot 62.9G | free 8.34G | cache 45.2G | buff 1.23G | slab 2.1G | # # SWP | tot 15.0G | free 14.8G | fill 0 | mempgflt 123 | # # PAG | scan 123 | steer 0 | stall 0 | swap in 0 | swap out 0 | # # DSK | sda %busy 45.23 | read 1234 | write 5678 | %busy 12.34 | # # NET | eth0 pks in 1234 | out 2345 | ins 12.34 | outs 23.45 | # # PID SYSCPU USRCPU VGROW RGROW RSS CMD # 12345 0.15 0.23 0K 0K 1.2G mysqld # 12346 0.05 0.12 0K 0K 234M redis-server
關(guān)鍵列說(shuō)明:
SYSCPU/USRCPU:系統(tǒng)CPU時(shí)間和用戶CPU時(shí)間
VGROW/RGROW:虛擬內(nèi)存增長(zhǎng)
RSS:物理內(nèi)存占用
DSK:磁盤IO百分比
NET:網(wǎng)絡(luò)流量
實(shí)戰(zhàn)案例:用htop快速定位CPU飆高的元兇
# 場(chǎng)景:服務(wù)器CPU使用率突然達(dá)到90%+,需要快速定位 # 1. SSH到服務(wù)器,執(zhí)行htop htop # 2. 按 F3 或 / 搜索可疑進(jìn)程 # 假設(shè)進(jìn)程名是 java /java # 3. 如果找到多個(gè)java進(jìn)程,按 t 切換樹形視圖 # 看哪個(gè)java進(jìn)程的子進(jìn)程在消耗CPU # 4. 確認(rèn)后按 k 殺掉 # 選擇進(jìn)程后,按 k # 選擇 15 (TERM) 先嘗試優(yōu)雅終止 # 如果沒(méi)反應(yīng),再按 k 選擇 9 (KILL) 強(qiáng)制殺死 # 5. 如果要深入分析,按 s 跟蹤系統(tǒng)調(diào)用 # strace -p
工具2:iotop - 交互式磁盤IO監(jiān)控
場(chǎng)景問(wèn)題
服務(wù)器IO高,但不知道是哪個(gè)進(jìn)程在讀寫。有人用iostat看到磁盤%util快滿了,但到底是MySQL在寫還是日志在寫,還是某個(gè)備份腳本在折騰?需要按進(jìn)程維度看IO占用。
工具介紹
iotop是專門用來(lái)按進(jìn)程查看磁盤IO的工具,類似于top但專注于IO維度??梢钥吹矫總€(gè)進(jìn)程讀取和寫入的速度,以及IO等待時(shí)間占比。
安裝
# RHEL/CentOS yum install iotop -y # Debian/Ubuntu apt install iotop -y
核心用法
iotop基本操作:
# 啟動(dòng)iotop(需要root權(quán)限) sudo iotop # 界面說(shuō)明: # 第一行:Total DISK READ和Total DISK WRITE # 第二行:Current DISK READ和Current DISK WRITE # 進(jìn)程列表: # TID:線程ID # PRIO:優(yōu)先級(jí) # USER:用戶名 # DISK READ:讀取速度 # DISK WRITE:寫入速度 # IO:IO百分比 # COMMAND:命令 # iotop快捷鍵: # 方向鍵↑↓ 選擇進(jìn)程 # 空格 暫停/恢復(fù) # r 倒序排序 # o 只顯示有IO的進(jìn)程 # a 顯示累計(jì)IO(不顯示速度) # q 退出
iotop高級(jí)用法:
# 非交互模式,每秒刷新一次 sudo iotop -b # 非交互,刷新5次 sudo iotop -b -n 5 # 只顯示有IO讀寫的進(jìn)程(過(guò)濾掉idle進(jìn)程) sudo iotop -b -o # 指定間隔(0.5秒) sudo iotop -b -d 0.5 # 指定用戶 sudo iotop -b -u mysql # 顯示累計(jì)IO(適合看總體IO消耗) sudo iotop -b -a # 監(jiān)控特定進(jìn)程(持續(xù)觀察某個(gè)進(jìn)程的IO) watch -n 1'sudo iotop -b -p 12345'
配合其他工具定位問(wèn)題:
# 場(chǎng)景:MySQL服務(wù)器IO高,需要定位是哪個(gè)SQL在寫IO # 1. 用iotop確認(rèn)是不是MySQL sudo iotop -b -n 3 | grep mysql # 2. 確認(rèn)是MySQL后,查看當(dāng)前執(zhí)行的SQL mysql -e"SHOW FULL PROCESSLISTG" # 3. 查看MySQL的IO等待事件 mysql -e"SHOW ENGINE INNODB STATUSG"| grep -A5"LOCK" # 4. 查看InnoDB緩沖池命中率 mysql -e"SHOW STATUS LIKE 'Innodb_buffer_pool%';" # 5. 查看慢查詢?nèi)罩?tail -100 /var/log/mysql/slow.log
實(shí)戰(zhàn)案例:排查日志寫入阻塞
# 場(chǎng)景:日志服務(wù)器寫入慢,磁盤IO高 # 1. 用iotop定位寫IO進(jìn)程 sudo iotop -b -o -n 5 # 輸出示例: # Total DISK READ: 0.00 B/s | Total DISK WRITE: 56.78 MB/s # TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND # 12345 be/4 root 0.00 B/s 5.23 M/s 0.00 % 0.01 % rsync # 12346 be/4 root 0.00 B/s 45.67 M/s 0.00 % 0.05 % rsyslogd # 12347 be/4 root 0.00 B/s 3.21 M/s 0.00 % 0.01 % httpd # 2. 發(fā)現(xiàn)rsyslogd寫入量最大,查看rsyslog配置 cat /etc/rsyslog.conf # 3. 查看當(dāng)日日志增長(zhǎng)量 du -sh /var/log/* # 4. 優(yōu)化方案: # - 開啟日志壓縮 # - 調(diào)整日志輪轉(zhuǎn)周期 # - 或者把日志目錄遷移到SSD
工具3:nethogs - 按進(jìn)程查看網(wǎng)絡(luò)流量
場(chǎng)景問(wèn)題
服務(wù)器帶寬突然打滿了,但iftop只能看到IP級(jí)別的流量,不知道是哪個(gè)進(jìn)程在瘋狂占用帶寬??赡苁悄硞€(gè)被攻擊的Web服務(wù),可能是日志收集腳本有bug,可能是內(nèi)網(wǎng)備份沒(méi)做限速。
工具介紹
nethogs是按進(jìn)程/程序統(tǒng)計(jì)網(wǎng)絡(luò)流量的工具,類似于top的思路,但專注于網(wǎng)絡(luò)維度。能直觀看到哪個(gè)進(jìn)程在收發(fā)數(shù)據(jù)、速度多少、占多少帶寬。
安裝
# RHEL/CentOS (需要EPEL倉(cāng)庫(kù)) yum install nethogs -y # Debian/Ubuntu apt install nethogs -y
核心用法
nethogs基本操作:
# 啟動(dòng)nethogs(需要root權(quán)限) sudo nethogs # 監(jiān)控指定網(wǎng)卡 sudo nethogs eth0 # 監(jiān)控多個(gè)網(wǎng)卡 sudo nethogs eth0 eth1 # nethogs快捷鍵: # q 退出 # m 切換單位(KB/s、MB/s、B/s) # r 按接收流量排序 # s 按發(fā)送流量排序
nethogs非交互模式:
# 非交互模式,持續(xù)監(jiān)控并輸出到文件 sudo nethogs -d 1 -c 60 -a > /tmp/nethogs.log & # -d: 刷新間隔(秒) # -c: 刷新次數(shù) # -a: 監(jiān)控所有(包括已結(jié)束的連接)
配合iftop更精確定位:
# 場(chǎng)景:Web服務(wù)器帶寬占滿,需要定位是哪個(gè)IP在訪問(wèn) # 1. 用iftop查看TOP IP sudo iftop -n -N -P # 看到大量來(lái)自某個(gè)IP的連接 # 2. 用nethogs確認(rèn)是哪個(gè)進(jìn)程 sudo nethogs -d 1 # 看到httpd進(jìn)程對(duì)外發(fā)送流量很大 # 3. 查看httpd連接狀態(tài) sudo netstat -anp | grep :80 | grep ESTABLISHED | wc -l # 4. 查看具體連接 sudo netstat -anp | grep :80 | head -50 # 5. 確認(rèn)攻擊后,封禁IP sudo iptables -I INPUT -s 1.2.3.4 -j DROP # 6. 保存iptables規(guī)則 sudo service iptables save
實(shí)戰(zhàn)案例:內(nèi)網(wǎng)備份搶帶寬
# 場(chǎng)景:每天凌晨備份時(shí)業(yè)務(wù)響應(yīng)變慢,懷疑備份占用帶寬
# 1. 在備份開始時(shí)運(yùn)行nethogs
sudo nethogs -d 1 > /tmp/nethogs_backup.log &
# 2. 等待備份結(jié)束,分析日志
grep -v"Kbit"/tmp/nethogs_backup.log | awk'{print $2, $10}'| sort -rn | head -10
# 3. 發(fā)現(xiàn)是rsync進(jìn)程占用帶寬最高
# 4. 優(yōu)化備份腳本,限制rsync速度
# 在備份腳本中加入 --bwlimit 參數(shù)
rsync -avz --bwlimit=50000 /data/ backup-server:/backup/
# 50000 = 50MB/s,根據(jù)業(yè)務(wù)需求調(diào)整
工具4:ncdu - 磁盤使用量分析
場(chǎng)景問(wèn)題
磁盤滿了,想知道是誰(shuí)占用的。用df知道整體情況,用du一個(gè)目錄一個(gè)目錄慢慢查太慢。某天發(fā)現(xiàn)根分區(qū)滿了,得快速定位是哪個(gè)目錄在吃空間。
工具介紹
ncdu是NCurses Disk Usage的縮寫,基于ncurses庫(kù)的交互式磁盤分析工具。比du快很多倍,支持在終端里瀏覽目錄結(jié)構(gòu)、排序、刪除。排查"磁盤空間去哪兒了"這類問(wèn)題特別有用。
安裝
# RHEL/CentOS yum install ncdu -y # Debian/Ubuntu apt install ncdu -y
核心用法
ncdu基本操作:
# 分析根分區(qū)(需要一點(diǎn)時(shí)間) sudo ncdu / # 分析指定目錄 sudo ncdu /var # 分析當(dāng)前目錄 ncdu # ncdu快捷鍵: # ↑↓ 上下導(dǎo)航 # Enter 進(jìn)入子目錄 # ← 返回上級(jí)目錄 # n 按名稱排序 # s 按大小排序 # C 按項(xiàng)目數(shù)排序(目錄內(nèi)文件數(shù)) # d 刪除當(dāng)前文件/目錄(危險(xiǎn)!) # t 切換是否顯示子目錄總大小 # g 顯示百分比條 # q 退出
ncdu高級(jí)用法:
# 快速掃描,不顯示詳細(xì)信息(適合大目錄)
ncdu -1 /
# 只顯示超過(guò)100MB的文件/目錄
ncdu --max-depth 1 /
# 排除特定目錄(如/proc、/sys)
ncdu -x /
# 導(dǎo)出結(jié)果到文件
ncdu -o /tmp/ncdu.txt /
# 導(dǎo)入結(jié)果查看(離線分析)
ncdu -r /tmp/ncdu.txt
# 靜默模式(不顯示進(jìn)度)
ncdu -q /
# 結(jié)合find快速定位大文件
find / -typef -size +1G -execls -lh {} ;
實(shí)戰(zhàn)案例:根分區(qū)滿了怎么查
# 場(chǎng)景:根分區(qū)使用率100%,需要快速定位 # 1. 先用df確認(rèn) df -h / # 2. 用ncdu分析根分區(qū) sudo ncdu -x / # 3. 在ncdu界面里按 s 切換到按大小排序 # 很快就看到哪個(gè)目錄最大 # 4. 常見的大目錄檢查項(xiàng): # /var/log - 日志 # /var/lib/mysql - 數(shù)據(jù)庫(kù) # /tmp - 臨時(shí)文件 # /opt - 安裝的軟件 # /home - 用戶目錄 # 5. 發(fā)現(xiàn)是 /var/log 太大,按 Enter 進(jìn)入 # 繼續(xù)按大小排序,找到異常大的日志文件 # 6. 刪除前先確認(rèn) # 查看日志文件最后修改時(shí)間 ls -lht /var/log/*.log| head # 查看日志文件內(nèi)容(確認(rèn)可以刪除) tail /var/log/messages
清理腳本模板:
#!/bin/bash
# safe_cleanup.sh - 安全清理腳本
LOG_DIR="/var/log"
BACKUP_DIR="/var/backup/logs_$(date +%Y%m%d)"
echo"=== 日志清理 ==="
echo"備份目錄:$BACKUP_DIR"
# 1. 創(chuàng)建備份目錄
mkdir -p"$BACKUP_DIR"
# 2. 找出超過(guò)7天的日志文件(保留最近的)
find$LOG_DIR-name"*.log"-typef -mtime +7 |whilereadlogfile;do
echo"備份并清理:$logfile($(du -h $logfile | cut -f1))"
# 先備份
cp -a"$logfile""$BACKUP_DIR/"
# 再清空(不刪除文件句柄)
>"$logfile"
done
# 3. 清理臨時(shí)文件
echo""
echo"=== 清理臨時(shí)文件 ==="
# 清理 /tmp 下超過(guò)7天的文件
find /tmp -typef -mtime +7 -name"*.tmp"-execrm -f {} ; -print
# 4. 記錄清理結(jié)果
echo""
echo"=== 清理完成 ==="
echo"備份文件:$BACKUP_DIR"
echo"釋放空間:$(du -sh $BACKUP_DIR)"
工具5:strace - 系統(tǒng)調(diào)用追蹤
場(chǎng)景問(wèn)題
某個(gè)程序啟動(dòng)后卡住了,不知道在干什么?;蛘呤悄硞€(gè)命令執(zhí)行很慢,想知道慢在哪個(gè)系統(tǒng)調(diào)用上。程序莫名其妙退出,沒(méi)有任何錯(cuò)誤日志。
工具介紹
strace是Linux下強(qiáng)大的程序調(diào)試和診斷工具,能追蹤進(jìn)程執(zhí)行過(guò)程中的系統(tǒng)調(diào)用(system calls)和信號(hào)(signals),可以看到程序在做什么:打開了哪些文件、讀寫了什么數(shù)據(jù)、調(diào)用了什么函數(shù)、花了多少時(shí)間。
安裝
# RHEL/CentOS yum install strace -y # Debian/Ubuntu apt install strace -y
核心用法
strace基本操作:
# 跟蹤命令執(zhí)行 strace ls /tmp # 跟蹤進(jìn)程(知道PID的情況) strace -p 12345 # 跟蹤新進(jìn)程(fork后自動(dòng)跟蹤子進(jìn)程) strace -f -p 12345 # 常用選項(xiàng): # -c 統(tǒng)計(jì)每個(gè)系統(tǒng)調(diào)用的時(shí)間、次數(shù)、錯(cuò)誤 # -f 跟蹤fork出來(lái)的子進(jìn)程 # -p PID 跟蹤指定進(jìn)程 # -o FILE 輸出到文件 # -t 顯示調(diào)用時(shí)間(秒級(jí)) # -tt 顯示調(diào)用時(shí)間(微秒級(jí)) # -T 顯示每個(gè)調(diào)用花費(fèi)的時(shí)間 # -e trace=open,read,write 只跟蹤特定調(diào)用 # -e trace=network 跟蹤網(wǎng)絡(luò)相關(guān)調(diào)用 # -e trace=file 跟蹤文件相關(guān)調(diào)用 # -e trace=process 跟蹤進(jìn)程相關(guān)調(diào)用 # -e signal=ALL 跟蹤所有信號(hào)
strace輸出解讀:
# strace ls /tmp 典型輸出:
# execve("/bin/ls", ["ls", "/tmp"], [/* 45 vars */]) = 0
# brk(NULL) = 0x1faa000
# mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f...
# access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
# open("/etc/ld.so.cache", O_RDONLY) = 3
# open("/etc/ld.so.cache", O_RDONLY) = 3
# open("/lib64/libc.so.6", O_RDONLY) = 3
# ...
# open("/tmp", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
# getdents(3, /* 12 entries */, 32768) = 368
# write(1, "file1
file2
file3
", 18) = 18
# +++ exited with 0 +++
# 解讀:
# execve - 執(zhí)行程序
# brk - 內(nèi)存分配
# mmap - 內(nèi)存映射
# open - 打開文件
# read/write - 讀寫文件
# getdents - 讀取目錄
# write - 輸出到標(biāo)準(zhǔn)輸出
# exited - 進(jìn)程退出
實(shí)用場(chǎng)景:
# 場(chǎng)景1:程序啟動(dòng)卡住,定位在哪個(gè)步驟 strace -f -o /tmp/strace.log your_program # Ctrl+C 后分析日志 tail -100 /tmp/strace.log # 場(chǎng)景2:找出程序慢在哪里 strace -c -T -p 12345 # 運(yùn)行一段時(shí)間后 Ctrl+C # 統(tǒng)計(jì)會(huì)顯示每個(gè)系統(tǒng)調(diào)用的時(shí)間和次數(shù) # 場(chǎng)景3:跟蹤程序打開的文件 strace -e trace=open,openat,read,write -p 12345 # 場(chǎng)景4:跟蹤網(wǎng)絡(luò)連接 strace -e trace=network -p 12345 # 場(chǎng)景5:跟蹤信號(hào) strace -e signal=ALL -p 12345 # 場(chǎng)景6:找出程序讀取了哪些配置文件 strace -e trace=open,openat -p 12345 2>&1 | grep".conf"
strace性能分析(-c統(tǒng)計(jì)):
# 跟蹤命令執(zhí)行并統(tǒng)計(jì) strace -c ls /tmp # 輸出示例: # % time seconds usecs/call calls errors syscall # ------ ----------- ----------- --------- --------- ------------------- # 40.12 0.000123 2 56 mmap # 25.33 0.000078 3 23 open # 20.11 0.000062 1 89 read # 10.22 0.000031 1 45 write # 4.22 0.000013 2 7 3 brk # ------ ----------- ----------- --------- --------- ------------------- # 100.00 0.000307 220 3 total # 解讀: # % time - 該系統(tǒng)調(diào)用占總時(shí)間的百分比 # calls - 調(diào)用次數(shù) # errors - 錯(cuò)誤次數(shù)
strace注意事項(xiàng):
# 1. strace會(huì)顯著降低程序性能,生產(chǎn)環(huán)境慎用 # 2. 跟蹤頻繁調(diào)用的進(jìn)程會(huì)產(chǎn)生大量輸出 # 3. 跟蹤時(shí)間過(guò)長(zhǎng)會(huì)產(chǎn)生巨大的日志文件 # 4. 某些情況下strace無(wú)法跟蹤(如容器內(nèi)權(quán)限不足) # 5. 不建議長(zhǎng)時(shí)間在生產(chǎn)環(huán)境跟蹤
工具6:lsof - 列出打開的文件
場(chǎng)景問(wèn)題
想刪除某個(gè)文件,提示"文件正在被使用"。想重啟某個(gè)服務(wù),擔(dān)心有文件句柄沒(méi)關(guān)閉。想查看某個(gè)進(jìn)程打開了哪些文件,想知道端口被誰(shuí)占用了。
工具介紹
lsof是List Open Files的縮寫,可以列出進(jìn)程打開的所有文件。Linux里一切皆文件,包括普通文件、目錄、塊設(shè)備、網(wǎng)絡(luò) sockets、管道等。lsof能幫你查看這些被打開的資源。
安裝
# RHEL/CentOS yum install lsof -y # Debian/Ubuntu apt install lsof -y
核心用法
lsof基本操作:
# 查看所有打開的文件(需要root權(quán)限才能看到全部) sudo lsof # 查看某個(gè)用戶打開的文件 sudo lsof -u username # 查看某個(gè)進(jìn)程打開的文件 sudo lsof -p 12345 # 查看某個(gè)端口被誰(shuí)占用 sudo lsof -i :80 # 查看某個(gè)文件被誰(shuí)占用 sudo lsof /var/log/messages # 查看某類文件(所有網(wǎng)絡(luò)文件) sudo lsof -i # 查看所有網(wǎng)絡(luò)連接 sudo lsof -i -P -n # -P: 禁用端口號(hào)到服務(wù)名的轉(zhuǎn)換(更快) # -n: 禁用IP到主機(jī)名的轉(zhuǎn)換(更快)
常用場(chǎng)景:
# 場(chǎng)景1:查看端口占用
# 查找監(jiān)聽在80端口的進(jìn)程
sudo lsof -i :80
# 查找所有TCP連接
sudo lsof -i tcp
# 查找連接到特定主機(jī)的進(jìn)程
sudo lsof -i @192.168.1.100
# 查找UDP端口
sudo lsof -i udp
# 場(chǎng)景2:查看某個(gè)文件被哪些進(jìn)程使用
sudo lsof /var/log/messages
# 場(chǎng)景3:查看某個(gè)用戶打開的所有文件
sudo lsof -u mysql
# 場(chǎng)景4:查看某個(gè)目錄下的所有打開文件
sudo lsof +D /var/log/
# +D: 遞歸查找(慎用,會(huì)掃描目錄)
# 場(chǎng)景5:查找打開的文件數(shù)量最多的進(jìn)程
sudo lsof | awk'{print $1}'| sort | uniq -c | sort -rn | head
# 場(chǎng)景6:查看進(jìn)程打開的網(wǎng)絡(luò)連接數(shù)
sudo lsof -i -n -P | awk'{print $9}'| cut -d: -f2 | sort | uniq -c | sort -rn | head
lsof高級(jí)用法:
# 查看已刪除但未釋放空間的文件(常見的日志問(wèn)題) sudo lsof | grep deleted # 輸出示例: # COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME # mysqld 123 mysql 4u REG 8,1 12345 67890 /var/log/mysql/slow.log (deleted) # 這說(shuō)明MySQL還在持有這個(gè)已刪除的日志文件 # 需要重啟MySQL或執(zhí)行:kill -9 12345 # 查看某個(gè)文件系統(tǒng)的所有打開文件 sudo lsof +f -- /data # 查看某類設(shè)備的打開文件 sudo lsof +D /dev/ # 查看某個(gè)進(jìn)程打開的socket sudo lsof -p 12345 -U # 查看某類文件的統(tǒng)計(jì) sudo lsof -s
實(shí)戰(zhàn)案例:排查"文件正在被使用"
# 場(chǎng)景:嘗試刪除文件時(shí)報(bào)錯(cuò) rm /tmp/test.log # rm: cannot remove '/tmp/test.log': Text file busy # 1. 查看文件被誰(shuí)占用 sudo lsof /tmp/test.log # 輸出: # COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME # bash 12345 user 3u REG 8,1 1234 56789 /tmp/test.log # 2. 確認(rèn)是什么操作 sudo lsof -p 12345 -a -d 3 # 3. 處理方案: # 方案A:通知進(jìn)程正常關(guān)閉文件 kill-TERM 12345 # 方案B:強(qiáng)制關(guān)閉 kill-9 12345 # 方案C:如果進(jìn)程是bash,可以 exit 退出會(huì)話
實(shí)戰(zhàn)案例:排查日志文件不釋放問(wèn)題
# 場(chǎng)景:日志文件已經(jīng)被刪除,但磁盤空間沒(méi)釋放 # 1. 查看已刪除但仍打開的文件 sudo lsof | grep deleted # 輸出: # COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME # rsyslogd 123 root 3w REG 8,1 0 12345 /var/log/messages (deleted) # rsyslogd 123 root 4w REG 8,1 0 12346 /var/log/secure (deleted) # 2. 發(fā)現(xiàn)rsyslogd還在寫這些已刪除的日志文件 # 3. 解決方案: # 方案A:重啟rsyslog(會(huì)丟失一些日志) systemctl restart rsyslog # 方案B:通知進(jìn)程關(guān)閉文件句柄 # 向rsyslogd發(fā)送HUP信號(hào)讓它重新打開日志文件 killall -HUP rsyslogd # 4. 驗(yàn)證 df -h /var sudo lsof | grep deleted | grep rsyslog # 應(yīng)該沒(méi)有輸出了
工具7:tcpdump - 網(wǎng)絡(luò)抓包
場(chǎng)景問(wèn)題
服務(wù)器網(wǎng)絡(luò)有問(wèn)題,不知道是丟包還是延遲,不知道是哪個(gè)連接有問(wèn)題。Web服務(wù)響應(yīng)慢,想看看請(qǐng)求和響應(yīng)內(nèi)容。懷疑服務(wù)器被掃描或攻擊,想看看流量特征。
工具介紹
tcpdump是Linux下最經(jīng)典的網(wǎng)絡(luò)抓包工具,能捕獲和分析網(wǎng)絡(luò)數(shù)據(jù)包,是排查網(wǎng)絡(luò)問(wèn)題的瑞士軍刀。配合Wireshark可以分析更復(fù)雜的流量。
安裝
# RHEL/CentOS yum install tcpdump -y # Debian/Ubuntu apt install tcpdump -y
核心用法
tcpdump基本操作:
# 抓取所有包(需要root) sudo tcpdump # 抓取指定網(wǎng)卡 sudo tcpdump -i eth0 # 抓取指定數(shù)量包 sudo tcpdump -i eth0 -c 100 # 保存到文件(后續(xù)用Wireshark分析) sudo tcpdump -i eth0 -w /tmp/capture.pcap # 讀取抓包文件 sudo tcpdump -r /tmp/capture.pcap # 只抓TCP包 sudo tcpdump -i eth0 tcp # 只抓UDP包 sudo tcpdump -i eth0 udp # 只抓ICMP包 sudo tcpdump -i eth0 icmp
BPF過(guò)濾器(最核心的功能):
# 抓取特定端口 sudo tcpdump -i eth0 port 80 sudo tcpdump -i eth0 port 3306 # 抓取特定主機(jī) sudo tcpdump -i eth0 host 192.168.1.100 # 抓取特定源IP sudo tcpdump -i eth0 src host 192.168.1.100 # 抓取特定目標(biāo)IP sudo tcpdump -i eth0 dst host 192.168.1.100 # 組合條件 sudo tcpdump -i eth0 host 192.168.1.100 and port 80 sudo tcpdump -i eth0 port 80 or port 443 sudo tcpdump -i eth0 src host 192.168.1.100 and not port 22 # 抓取HTTP請(qǐng)求 sudo tcpdump -i eth0 -A'tcp[((tcp[12:1] & 0xf0) >> 2):2] = 0x4745' # 0x4745 是 "GE" (GET請(qǐng)求開始) # 抓取HTTP Host頭 sudo tcpdump -i eth0 -A'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x48545450'| grep Host # 0x48545450 是 "HTTP"
tcpdump輸出格式詳解:
# 典型輸出: # 1000.123456 IP 192.168.1.100.54321 > 192.168.1.1.80: Flags [S], seq 12345, win 65535, length 0 # 解釋: # 1000.123456 - 時(shí)間戳(微秒精度) # IP - 協(xié)議 # 192.168.1.100.54321 - 源IP和源端口 # > - 流量方向 # 192.168.1.1.80 - 目標(biāo)IP和目標(biāo)端口 # Flags [S] - TCP標(biāo)志位(S=SYN,F(xiàn)=FIN,P=PSH,A=ACK) # seq 12345 - 序列號(hào) # win 65535 - 窗口大小 # length 0 - 數(shù)據(jù)長(zhǎng)度 # TCP標(biāo)志位組合: # [S] SYN - 連接建立 # [S.] SYN-ACK - 連接響應(yīng) # [.] ACK - 確認(rèn) # [P.] PSH-ACK - 推送數(shù)據(jù) # [F.] FIN - 結(jié)束連接 # [R.] RST - 重置連接 # [S.F.] SYN-FIN - 異常
實(shí)用場(chǎng)景:
# 場(chǎng)景1:排查Web響應(yīng)慢 sudo tcpdump -i eth0 -A port 80 | grep -E"GET|HTTP/1.1|200 OK" # 場(chǎng)景2:查看TCP連接建立過(guò)程(SYN握手問(wèn)題) sudo tcpdump -i eth0'tcp[tcpflags] = tcp-syn' # 場(chǎng)景3:查看TCP連接斷開過(guò)程 sudo tcpdump -i eth0'tcp[tcpflags] & tcp-fin != 0' # 場(chǎng)景4:查看TCP重傳 sudo tcpdump -i eth0'tcp[tcpflags] & tcp-ack != 0'| grep"retransmission" # 場(chǎng)景5:查看ICMP(ping)包 sudo tcpdump -i eth0 icmp # 場(chǎng)景6:查看DNS查詢和響應(yīng) sudo tcpdump -i eth0 port 53 # 場(chǎng)景7:查看ARP流量(鄰居發(fā)現(xiàn)) sudo tcpdump -i eth0 arp # 場(chǎng)景8:抓取特定IP的所有包 sudo tcpdump -i eth0 host 192.168.1.100 -w /tmp/host.pcap # 場(chǎng)景9:實(shí)時(shí)查看HTTP請(qǐng)求 sudo tcpdump -i eth0 -A -s 0'tcp port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420' # 0x47455420 = "GET "
tcpdump與Wireshark配合:
# 1. 在服務(wù)器上抓包保存 sudo tcpdump -i eth0 -w /tmp/capture.pcap host 192.168.1.100 and port 80 # 2. Ctrl+C 停止抓包 # 3. 下載到本地(用scp或rz) scp user@server:/tmp/capture.pcap ./ # 4. 用Wireshark打開分析 # wireshark capture.pcap # 或者在本地直接分析遠(yuǎn)程抓包 # wireshark -k -i <(ssh user@server "tcpdump -i eth0 -w - host 192.168.1.100")
tcpdump性能分析:
# 場(chǎng)景:排查網(wǎng)絡(luò)延遲是丟包還是高延遲
# 1. 查看SYN重傳
sudo tcpdump -i eth0'tcp[tcpflags] = tcp-syn'| grep"retransmission"
# 2. 查看重復(fù)ACK(丟包信號(hào))
sudo tcpdump -i eth0'tcp[13] = 2'| head
# 3. 查看窗口大小變化(判斷是否因窗口為0導(dǎo)致卡頓)
sudo tcpdump -i eth0'tcp[13] & 2 != 0'| awk'{print $3, $5}'| sort | uniq -c
# 4. 查看連接建立時(shí)間
sudo tcpdump -i eth0'tcp[tcpflags] = tcp-syn'-T statistics
工具8:netstat/ss - 網(wǎng)絡(luò)連接查看
場(chǎng)景問(wèn)題
想看服務(wù)器有哪些連接在建立、有多少連接是ESTABLISHED、有多少在TIME_WAIT。想看某個(gè)端口被誰(shuí)監(jiān)聽,想查Socket隊(duì)列有沒(méi)有堆積。
工具介紹
netstat是經(jīng)典的網(wǎng)絡(luò)統(tǒng)計(jì)工具,功能全面但稍慢。ss是netstat的現(xiàn)代替代品,速度快很多,能顯示更多信息。兩者配合使用。
安裝
# 默認(rèn)已安裝,如果沒(méi)有: yum install net-tools iproute -y # netstat和ss apt install net-tools iproute2 -y
核心用法
netstat基本操作:
# 查看所有連接 netstat -an # 只顯示監(jiān)聽端口 netstat -ln # 顯示TCP連接 netstat -tn # 顯示UDP連接 netstat -un # 顯示Socket摘要 netstat -s # 顯示路由表 netstat -r # 顯示接口統(tǒng)計(jì) netstat -i # 顯示進(jìn)程信息(需要root) netstat -tnp # 常用組合:查看TCP連接狀態(tài)統(tǒng)計(jì) netstat -tn | awk'/^tcp/ {print $6}'| sort | uniq -c | sort -rn
ss基本操作:
# ss比netstat更快
# 查看所有連接
ss -an
# 查看監(jiān)聽端口
ss -ln
# 查看TCP連接
ss -tn
# 查看UDP連接
ss -un
# 查看Socket摘要
ss -s
# 查看進(jìn)程信息
ss -tnp
# 查看詳細(xì)Timer信息(連接超時(shí)、重傳等)
ss -ti
# 查看內(nèi)存信息
ss -m
# 常用組合:按狀態(tài)統(tǒng)計(jì)TCP連接
ss -tn | awk'/^tcp/ {print $1}'| sort | uniq -c | sort -rn
# 查看特定端口
ss -tn sport = :80 or dport = :80
ss -tn state established'( sport = :80 or dport = :80 )'
連接狀態(tài)分析:
# 查看各狀態(tài)的連接數(shù) ss -tn state time-wait | wc -l # TIME_WAIT數(shù)量 ss -tn state established | wc -l # ESTABLISHED數(shù)量 # 查看TIME_WAIT的原因 # 大量TIME_WAIT通常是頻繁創(chuàng)建短連接導(dǎo)致 # 優(yōu)化方法: # 1. 服務(wù)端開啟 TIME_WAIT 復(fù)用 # 2. 客戶端使用長(zhǎng)連接 # 3. 調(diào)整內(nèi)核參數(shù) # 查看半開連接(SYN_RECV) ss -tn state syn-recv # 查看連接隊(duì)列堆積 # 如果SYN_RECV很多,說(shuō)明連接隊(duì)列滿了 # 查看全連接隊(duì)列(listen backlog) ss -ltn sport = :80 # Backlog 列就是全連接隊(duì)列長(zhǎng)度 # 查看半連接隊(duì)列 ss -ltn sport = :80 # 如果Send-Q < Recv-Q,可能半連接隊(duì)列有問(wèn)題
Socket緩沖區(qū)分析:
# 查看讀寫緩沖區(qū)大小 ss -tm # 輸出: # State Recv-Q Send-Q Local Address:Port Peer Address:Port # ESTAB 0 0 192.168.1.1:80 192.168.1.100:54321 # mem:(r4368000,w8736000) # Recv-Q/Send-Q:當(dāng)前在隊(duì)列中的數(shù)據(jù) # mem:(r4368000,w8736000) = 讀寫緩沖區(qū)大?。ㄗ止?jié)) # 查看內(nèi)存使用 ss -sam # 查看是否有內(nèi)存泄漏 watch -n 1'ss -s' # 觀察 total memory 是否持續(xù)增長(zhǎng)
實(shí)戰(zhàn)案例:排查Web服務(wù)器連接數(shù)過(guò)多
# 場(chǎng)景:Web服務(wù)器響應(yīng)很慢,懷疑連接數(shù)過(guò)多
# 1. 查看TCP連接狀態(tài)統(tǒng)計(jì)
ss -s
# 輸出示例:
# Total: 456 (kernel 512)
# TCP: 1234 (kernel 512)
# ...
# ESTABLISHED: 123
# SYN_SENT: 5
# TIME_WAIT: 890 <-- 大量TIME_WAIT
# 2. 查看TIME_WAIT分布
ss -tn state time-wait | awk?'{print $4}'?| cut -d: -f2 | sort | uniq -c | sort -rn | head
# 3. 查看ESTABLISHED分布
ss -tn state established | awk?'{print $5}'?| cut -d: -f2 | sort | uniq -c | sort -rn | head
# 4. 查看每個(gè)IP的連接數(shù)
ss -tn | awk?'{print $5}'?| cut -d: -f1 | sort | uniq -c | sort -rn | head
# 5. 如果某個(gè)IP連接數(shù)異常,可能在攻擊
# 查看具體連接
ss -tn | grep?"1.2.3.4"
# 6. 應(yīng)對(duì)措施:
# - 封禁異常IP
iptables -I INPUT -s 1.2.3.4 -j DROP
# - 調(diào)整TIME_WAIT重用
echo?1 > /proc/sys/net/ipv4/tcp_tw_reuse
# - 調(diào)整最大連接數(shù)
echo4096 > /proc/sys/net/core/somaxconn
內(nèi)核參數(shù)調(diào)優(yōu):
# /etc/sysctl.conf 添加 # TIME_WAIT重用(客戶端) net.ipv4.tcp_tw_reuse = 1 # TIME_WAIT超時(shí)時(shí)間(默認(rèn)60秒) net.ipv4.tcp_fin_timeout = 30 # 允許孤兒socket數(shù)量 net.ipv4.tcp_max_orphans = 262144 # TCP buffer自動(dòng)調(diào)優(yōu) net.ipv4.tcp_rmem = 4096 87380 6291456 net.ipv4.tcp_wmem = 4096 65536 6291456 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 # 連接隊(duì)列 net.core.somaxconn = 4096 net.ipv4.tcp_max_syn_backlog = 8192 # 應(yīng)用配置 sysctl -p
工具9:curl + 常用網(wǎng)絡(luò)診斷
場(chǎng)景問(wèn)題
需要測(cè)試HTTP接口是否正常,想看響應(yīng)頭和響應(yīng)時(shí)間。DNS解析對(duì)不對(duì),CDN是否生效,想模擬各種HTTP請(qǐng)求。
工具介紹
curl是命令行里最常用的HTTP工具,支持各種協(xié)議和各種選項(xiàng)。不只是發(fā)請(qǐng)求,還能做認(rèn)證、Cookie、文件上傳下載、代理等。
核心用法
HTTP請(qǐng)求:
# GET請(qǐng)求 curl https://example.com # GET請(qǐng)求,顯示響應(yīng)頭 curl -i https://example.com # GET請(qǐng)求,只顯示響應(yīng)頭 curl -I https://example.com # 顯示請(qǐng)求和響應(yīng)頭(調(diào)試用) curl -v https://example.com # 顯示更詳細(xì)的信息(包括證書、版本等) curl -vv https://example.com # 跟隨重定向 curl -L https://example.com # 保存到文件 curl -o /tmp/output.html https://example.com # 下載文件(自動(dòng)用原文件名) curl -O https://example.com/file.tar.gz # 不顯示進(jìn)度條 curl -s -O https://example.com/file.tar.gz
POST請(qǐng)求:
# POST表單數(shù)據(jù)
curl -X POST -d"username=admin&password=123456"https://example.com/login
# POST JSON數(shù)據(jù)
curl -X POST -H"Content-Type: application/json"
-d'{"username":"admin","password":"123456"}'
https://example.com/api/login
# 帶認(rèn)證的POST
curl -X POST -u user:pass
-d"data=value"
https://example.com/api
# 文件上傳
curl -X POST -F"file=@/tmp/test.txt"https://example.com/upload
# 設(shè)置自定義頭
curl -H"Authorization: Bearer token123"
-H"X-Custom-Header: value"
https://example.com/api
高級(jí)用法:
# 限速下載(100KB/s) curl --limit-rate 100k -O https://example.com/largefile.tar.gz # 最大下載時(shí)間 curl -m 30 -O https://example.com/file # 30秒超時(shí) # 連接超時(shí)(比-m更細(xì)粒度) curl --connect-timeout 10 -I https://example.com # 使用代理 curl -x http://proxy.example.com:8080 https://example.com # 使用Cookie curl -b"session=abc123"https://example.com/api # 保存Cookie到文件 curl -c /tmp/cookies.txt https://example.com/login # 讀取Cookie文件 curl -b /tmp/cookies.txt https://example.com/api # 跳過(guò)證書驗(yàn)證(測(cè)試用) curl -k https://example.com(測(cè)試用,不推薦生產(chǎn)用) # 指定TLS版本 curl --tlsv1.2 https://example.com # 指定CA證書 curl --cacert /etc/ssl/certs/ca-certificates.crt https://example.com
實(shí)用腳本:
#!/bin/bash
# http_health_check.sh - HTTP健康檢查腳本
check_http() {
localurl=$1
localname=${2:-$url}
localexpected_code=${3:-200}
# 獲取狀態(tài)碼和響應(yīng)時(shí)間
response=$(curl -o /dev/null -s -w"%{http_code}|%{time_total}|%{size_download}"
--connect-timeout 5 -L"$url")
code=$(echo$response| cut -d'|'-f1)
time=$(echo$response| cut -d'|'-f2)
size=$(echo$response| cut -d'|'-f3)
if["$code"="$expected_code"];then
echo"[OK]$name- HTTP$code-${time}s -${size}bytes"
return0
else
echo"[FAIL]$name- Expected$expected_code, got$code-${time}s"
return1
fi
}
# 使用示例
check_http"https://example.com""主站""200"
check_http"https://example.com/api/health""API健康檢查""200"
check_http"https://example.com/static/test.js""靜態(tài)資源""200"
check_http"https://example.com/notexist""404測(cè)試""404"
DNS調(diào)試:
# 查看DNS解析過(guò)程(配合watch) watch -n 1'dig example.com +short' # 模擬DNS查詢 dig @8.8.8.8 example.com # 只查看Answer部分 dig example.com +short # 查看完整DNS記錄 dig example.com ANY # 查看MX記錄 dig example.com MX # 反向DNS查詢 dig -x 93.184.216.34 # 批量檢查域名解析 fordomaininexample.com google.com github.com;do ip=$(dig +short$domain) echo"$domain->$ip" done
CDN/CDN效果驗(yàn)證:
# 查看響應(yīng)頭(判斷CDN) curl -I https://example.com # 常見CDN響應(yīng)頭: # Cloudflare: cf-ray, cf-cache-status # Akamai: x-akamai-transformed, server # CloudFront: x-cache, via # 阿里云CDN: x-swift-optimized, x-oss # 對(duì)比直連和CDN # 直連IP dig +short example.com # 回源測(cè)試 curl -H"Host: example.com"http:/// # 檢查緩存狀態(tài) curl -I https://example.com/static/file.js # 看 Age: 表示CDN緩存了多少秒 # 看 x-cache-hit 表示命中緩存
工具10:systemctl + journalctl - 服務(wù)與日志管理
場(chǎng)景問(wèn)題
服務(wù)起不來(lái)了,想看啟動(dòng)失敗的原因。服務(wù)運(yùn)行正常但響應(yīng)慢,想看實(shí)時(shí)日志。想查看某個(gè)時(shí)間段的歷史日志。服務(wù)重啟了,想知道是誰(shuí)觸發(fā)的、為什么。
工具介紹
systemctl是systemd服務(wù)的控制工具,用來(lái)啟動(dòng)、停止、重啟、查看服務(wù)狀態(tài)。journalctl是systemd日志查看工具,比傳統(tǒng)的/var/log更強(qiáng)大,支持按時(shí)間、按服務(wù)、按級(jí)別過(guò)濾。
核心用法
systemctl基本操作:
# 查看服務(wù)狀態(tài) systemctl status nginx # 啟動(dòng)服務(wù) sudo systemctl start nginx # 停止服務(wù) sudo systemctl stop nginx # 重啟服務(wù) sudo systemctl restart nginx # 重新加載配置(不中斷連接) sudo systemctl reload nginx # 查看服務(wù)是否運(yùn)行 systemctl is-active nginx # 查看服務(wù)是否開機(jī)啟動(dòng) systemctl is-enabled nginx # 設(shè)置開機(jī)啟動(dòng) sudo systemctlenablenginx # 禁用開機(jī)啟動(dòng) sudo systemctldisablenginx # 重新加載systemd配置 sudo systemctl daemon-reload # 查看所有運(yùn)行的服務(wù) systemctl list-units --type=service --state=running # 查看所有失敗的服務(wù) systemctl --failed --type=service
journalctl基本操作:
# 查看所有日志(從最早開始) sudo journalctl # 從最新開始查看 sudo journalctl -e # 實(shí)時(shí)跟蹤日志 sudo journalctl -f # 查看特定服務(wù)的日志 sudo journalctl -u nginx # 查看特定服務(wù)的錯(cuò)誤日志 sudo journalctl -u nginx -p err # 日志級(jí)別:emerg (0), alert (1), crit (2), err (3), warning (4), notice (5), info (6), debug (7) # 按時(shí)間過(guò)濾 sudo journalctl --since"2026-05-11 1000" sudo journalctl --since"1 hour ago" sudo journalctl --since today sudo journalctl --since yesterday sudo journalctl --since"2026-05-01"--until"2026-05-02" # 查看上次啟動(dòng)的日志 sudo journalctl -b -1 # 查看指定boot ID的日志 sudo journalctl --list-boots sudo journalctl -b abc123def456 # 查看磁盤占用 sudo journalctl --disk-usage # 清理舊日志(保留最近7天) sudo journalctl --vacuum-time=7d # 清理到指定大小 sudo journalctl --vacuum-size=500M # 按行數(shù)限制 sudo journalctl --vacuum-files=5
組合使用技巧:
# 查看服務(wù)啟動(dòng)失敗原因 sudo systemctl status nginx sudo journalctl -u nginx -p err --no-pager -n 50 # 查看服務(wù)是否被人手動(dòng)重啟 sudo journalctl -u nginx --since"1 day ago"| grep -E"Started|Stopping|Started" # 查看某命令的執(zhí)行歷史 sudo journalctl --since"1 hour ago"| grep"nginx" # 查看內(nèi)核日志(dmesg) sudo journalctl -k # 查看所有 critical 級(jí)別的日志 sudo journalctl -p crit # 實(shí)時(shí)查看某服務(wù)的錯(cuò)誤 sudo journalctl -u nginx -p err -f # 統(tǒng)計(jì)各服務(wù)日志大小 forsvcinnginx mysql redis;do size=$(sudo journalctl -u$svc--since"30 days ago"2>/dev/null | wc -c) echo"$svc:$(($size/1024/1024))MB" done
服務(wù)管理進(jìn)階:
# 查看服務(wù)的依賴關(guān)系 systemctl list-dependencies nginx # 查看服務(wù)被誰(shuí)依賴 systemctl list-dependencies --reverse nginx # 查看服務(wù)資源限制 systemctl show nginx | grep -E"Memory|Limit" # 修改服務(wù)資源限制(臨時(shí)) sudo systemctlset-property nginx MemoryLimit=512M # 查看服務(wù)啟動(dòng)時(shí)間 systemctl show nginx -p ActiveEnterTimestamp # 查看服務(wù)的進(jìn)程 systemctl status nginx # 或 ps aux | grep nginx # 查看服務(wù)配置 systemctl cat nginx # 查看服務(wù)完整配置(包括默認(rèn)配置) systemctl show nginx
故障排查示例:
# 場(chǎng)景:nginx服務(wù)啟動(dòng)失敗 # 1. 查看服務(wù)狀態(tài) sudo systemctl status nginx # 2. 查看詳細(xì)日志 sudo journalctl -u nginx -p err --no-pager -n 100 # 3. 測(cè)試配置文件 sudo nginx -t # 4. 如果是端口被占用 sudo lsof -i :80 # 5. 殺死占用進(jìn)程 sudokill$(sudo lsof -t -i :80) # 6. 重新啟動(dòng) sudo systemctl restart nginx # 7. 驗(yàn)證 sudo systemctl status nginx curl -I localhost
# 場(chǎng)景:mysql服務(wù)自動(dòng)停止 # 1. 查看服務(wù)狀態(tài) sudo systemctl status mysql # 2. 查看什么時(shí)候停的、為什么停的 sudo journalctl -u mysql --since"1 day ago"| grep -E"Stopping|Started|Killed|OOM" # 3. 查看是否是OOM被kill sudo journalctl -k | grep -i"oom" dmesg | grep -i"oom" # 4. 查看資源限制 systemctl show mysql | grep -E"Memory|Limit" # 5. 如果是OOM,查看內(nèi)存使用峰值 sudo journalctl -u mysql --since"1 day ago"| grep -i"memory" # 6. 解決方案: # - 增加內(nèi)存 # - 優(yōu)化MySQL內(nèi)存配置(減少innodb_buffer_pool_size) # - 添加swap # - 設(shè)置OOM優(yōu)先級(jí)
總結(jié):工具組合使用示例
場(chǎng)景:Web服務(wù)器響應(yīng)慢綜合排查
#!/bin/bash
# web_slow_diagnose.sh - Web響應(yīng)慢綜合排查腳本
echo"=== Web服務(wù)器響應(yīng)慢排查 ==="
echo"開始時(shí)間:$(date)"
# 1. 初步診斷:系統(tǒng)資源
echo""
echo"--- CPU和內(nèi)存 ---"
top -b -n 1 | head -20
echo""
free -h
# 2. 查看網(wǎng)絡(luò)連接狀態(tài)
echo""
echo"--- 網(wǎng)絡(luò)連接統(tǒng)計(jì) ---"
ss -s
# 3. 查看TIME_WAIT數(shù)量
echo""
echo"--- TIME_WAIT分析 ---"
echo"TIME_WAIT數(shù)量:$(ss -tn state time-wait | wc -l)"
echo"ESTABLISHED數(shù)量:$(ss -tn state established | wc -l)"
# 4. 查看端口連接分布
echo""
echo"--- TOP連接IP ---"
ss -tn | awk'{print $5}'| cut -d: -f1 | sort | uniq -c | sort -rn | head -10
# 5. 查看進(jìn)程CPU/內(nèi)存占用
echo""
echo"--- TOP進(jìn)程 ---"
ps aux --sort=-%cpu | head -15
# 6. 查看磁盤IO
echo""
echo"--- 磁盤IO ---"
iostat -xcz 1 5 2>/dev/null | tail -20
# 7. 查看nginx日志(最近的錯(cuò)誤)
echo""
echo"--- Nginx錯(cuò)誤日志 ---"
tail -20 /var/log/nginx/error.log
# 8. 查看PHP-FPM狀態(tài)(如有)
ifsystemctl is-active php-fpm >/dev/null 2>&1;then
echo""
echo"--- PHP-FPM狀態(tài) ---"
curl -s localhost/status | head -20
fi
# 9. 查看后端連接(如使用proxy)
echo""
echo"--- 后端服務(wù)狀態(tài) ---"
curl -s localhost/health 2>/dev/null ||echo"health endpoint不可用"
echo""
echo"=== 排查完成 ==="
場(chǎng)景:數(shù)據(jù)庫(kù)連接問(wèn)題排查
#!/bin/bash
# db_connection_diagnose.sh - 數(shù)據(jù)庫(kù)連接問(wèn)題排查
echo"=== 數(shù)據(jù)庫(kù)連接問(wèn)題排查 ==="
# 1. 查看連接數(shù)
echo""
echo"--- MySQL連接統(tǒng)計(jì) ---"
mysql -e"SHOW STATUS LIKE 'Threads_connected';"
mysql -e"SHOW STATUS LIKE 'Max_used_connections';"
mysql -e"SHOW VARIABLES LIKE 'max_connections';"
# 2. 查看當(dāng)前連接
echo""
echo"--- 當(dāng)前連接 ---"
mysql -e"SHOW FULL PROCESSLISTG"| grep -E"Command|State|Info"| head -50
# 3. 分析連接狀態(tài)
echo""
echo"--- 連接狀態(tài)分布 ---"
mysql -e"SHOW FULL PROCESSLISTG"| grep"Command:"| sort | uniq -c | sort -rn
# 4. 分析連接來(lái)源
echo""
echo"--- 連接IP分布 ---"
mysql -e"SHOW FULL PROCESSLISTG"| grep"Host:"| awk -F:'{print $1}'| cut -d' '-f2 | sort | uniq -c | sort -rn | head -10
# 5. 查看慢查詢
echo""
echo"--- 慢查詢 ---"
mysql -e"SHOW GLOBAL STATUS LIKE 'Slow_queries';"
# 6. 查看鎖等待
echo""
echo"--- 鎖等待 ---"
mysql -e"SELECT * FROM information_schema.INNODB_LOCK_WAITSG"2>/dev/null ||echo"無(wú)鎖等待"
# 7. 查看系統(tǒng)資源
echo""
echo"--- 系統(tǒng)IO ---"
iostat -xcz 1 5 2>/dev/null | tail -15
# 8. 查看臨時(shí)表使用
echo""
echo"--- 臨時(shí)表使用 ---"
mysql -e"SHOW GLOBAL STATUS LIKE 'Created_tmp%';"
附錄:工具速查表
| 工具 | 用途 | 常用命令 |
|---|---|---|
| htop | 交互式進(jìn)程監(jiān)控 | htop ,htop -u user,htop -t |
| atop | 綜合系統(tǒng)監(jiān)控 | atop ,atop -r /var/log/atop/xxx |
| iotop | 進(jìn)程級(jí)IO監(jiān)控 | iotop -b -o ,iotop -b -u user |
| nethogs | 按進(jìn)程網(wǎng)絡(luò)流量 | nethogs eth0 |
| ncdu | 磁盤使用分析 | ncdu / ,ncdu -x / |
| strace | 系統(tǒng)調(diào)用追蹤 | strace -p PID ,strace -c command |
| lsof | 打開的文件 | lsof -i :80 ,lsof -p PID |
| tcpdump | 網(wǎng)絡(luò)抓包 | tcpdump -i eth0 port 80 -w file.pcap |
| netstat/ss | 網(wǎng)絡(luò)連接 | ss -tn ,ss -s,ss -tnp |
| curl | HTTP診斷 | curl -v ,curl -I,curl -X POST |
| journalctl | 系統(tǒng)日志 | journalctl -u svc -f ,journalctl --since today |
文檔信息
版本:1.0
更新日期:2026-05-11
適用系統(tǒng):RHEL/CentOS 7/8/9,Ubuntu 18.04/20.04/22.04
適用場(chǎng)景:Linux服務(wù)器日常運(yùn)維
-
Linux
+關(guān)注
關(guān)注
88文章
11846瀏覽量
219729 -
服務(wù)器
+關(guān)注
關(guān)注
14文章
10416瀏覽量
91819 -
命令
+關(guān)注
關(guān)注
5文章
763瀏覽量
24069
原文標(biāo)題:運(yùn)維人效率翻倍!10 個(gè)必裝 Linux 實(shí)用工具
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
matlab的實(shí)用工具命令
申請(qǐng)實(shí)用工具軟件版主!【申請(qǐng)通過(guò)】
LabVIEW實(shí)用工具***寶典課件
LabVIEW實(shí)用工具詳解簡(jiǎn)版.pdf
uartassist串口調(diào)試助手_實(shí)用工具
電阻色環(huán)的識(shí)別實(shí)用工具應(yīng)用程序免費(fèi)下載
PADS的win10顯示問(wèn)題補(bǔ)丁實(shí)用工具免費(fèi)下載
windows啟動(dòng)修復(fù)實(shí)用工具免費(fèi)下載
LLC計(jì)算的實(shí)用工具應(yīng)用程序免費(fèi)下載
關(guān)閉Win10自動(dòng)更新的實(shí)用工具免費(fèi)下載
10個(gè)必裝Linux實(shí)用工具推薦
評(píng)論