从入门到精通,掌握最全面的故障排查工具
今天,我给大家整理分享60个最实用的故障排查命令,按场景分类,每个都有详细说明。
看完将掌握:
收藏这一篇,故障排查不求人!
功能:快速查看系统运行时间、登录用户数和平均负载
语法:
uptime实战案例:
# 案例1:快速检查系统状态$ uptime 03:15:42 up 127 days, 14:23, 3 users, load average: 8.5, 7.2, 6.8 ↑ ↑ ↑ ↑ 当前时间 运行127天 3个用户 1/5/15分钟负载# 分析:# 负载8.5,如果是8核CPU,负载率约106%,系统过载# 需要立即查看是什么进程导致# 案例2:判断负载趋势$ uptimeload average: 2.5, 5.8, 8.2# 1分钟2.5,5分钟5.8,15分钟8.2# 负载在下降,说明问题正在缓解负载判断标准:
负载 / CPU核数: < 0.7:系统空闲 0.7-1.0:正常 1.0-2.0:轻度负载 2.0-5.0:中度负载 > 5.0:重度负载(需要立即处理)故障排查:
# 负载高,下一步:1. 查看是CPU还是IO导致 $ vmstat 12. 找出占用资源的进程 $ top3. 查看具体进程 $ ps aux --sort=-%cpu | head -10功能:显示系统内核和硬件信息
语法:
uname [选项]常用选项:
-a:显示所有信息-r:内核版本-m:硬件架构-n:主机名-s:内核名称实战案例:
# 案例1:查看完整系统信息$ uname -aLinux server1 5.10.0-21-amd64 #1 SMP Debian 5.10.162-1 (2023-01-21) x86_64 GNU/Linux ↑ ↑ ↑ 主机名 内核版本 架构# 案例2:只看内核版本$ uname -r5.10.0-21-amd64# 案例3:检查架构$ uname -mx86_64 # 64位系统故障排查场景:
# 场景1:软件兼容性问题$ uname -r# 检查内核版本是否满足软件要求# 场景2:驱动问题$ uname -a# 确认内核版本,下载对应驱动# 场景3:性能问题$ uname -r# 旧内核可能有性能bug,考虑升级功能:显示或设置系统主机名
语法:
hostname [选项] [新主机名]常用选项:
-f:显示FQDN(完全限定域名)-i:显示IP地址-I:显示所有IP地址-s:显示短主机名实战案例:
# 案例1:查看主机名$ hostnameserver1# 案例2:查看完整域名$ hostname -fserver1.example.com# 案例3:查看IP地址$ hostname -I192.168.1.100 10.0.0.100# 案例4:临时修改主机名$ hostname new-server# 重启后失效# 案例5:永久修改主机名$ hostnamectl set-hostname new-server# 或$ echo"new-server" > /etc/hostname故障排查场景:
# 场景1:集群节点识别$ hostname# 确认当前在哪台服务器# 场景2:网络配置问题$ hostname -I# 检查IP地址是否正确# 场景3:DNS解析问题$ hostname -f# 检查域名解析是否正常功能:显示或设置系统日期和时间
语法:
date [选项] [+格式]常用选项:
-d STRING:显示指定时间-s STRING:设置时间-u:显示UTC时间+FORMAT:自定义格式实战案例:
# 案例1:查看当前时间$ dateMon Jan 1 15:30:45 CST 2024# 案例2:自定义格式$ date"+%Y-%m-%d %H:%M:%S"2024-01-01 15:30:45# 案例3:查看时间戳$ date +%s1704096645# 案例4:时间戳转日期$ date -d @1704096645Mon Jan 1 15:30:45 CST 2024# 案例5:计算时间$ date -d "2 days ago"Sat Dec 30 15:30:45 CST 2023$ date -d "next Monday"Mon Jan 8 00:00:00 CST 2024# 案例6:设置时间(需root)$ date -s "2024-01-01 15:30:45"故障排查场景:
# 场景1:时间同步问题$ date# 检查时间是否正确# 场景2:日志时间对不上$ date$ date -u # 对比本地时间和UTC时间# 场景3:证书过期$ date# 检查系统时间是否正确# 场景4:定时任务不执行$ date# 确认时区和时间设置时间格式:
%Y:年(2024)%m:月(01-12)%d:日(01-31)%H:时(00-23)%M:分(00-59)%S:秒(00-59)%s:时间戳%F:日期(2024-01-01)%T:时间(15:30:45)功能:显示当前登录的用户信息
语法:
who [选项]w [选项]常用选项:
who -a:显示所有信息who -b:最后启动时间who -r:运行级别w:更详细的信息实战案例:
# 案例1:查看登录用户$ whoroot pts/0 2024-01-01 10:00 (192.168.1.200)admin pts/1 2024-01-01 14:30 (192.168.1.201)app pts/2 2024-01-01 15:00 (192.168.1.202)# 案例2:详细信息$ w 15:30:45 up 127 days, 14:23, 3 users, load average: 2.5, 1.8, 1.2USER TTY FROM LOGIN@ IDLE JCPU PCPU WHATroot pts/0 192.168.1.200 10:00 5:30m 0.12s 0.12s -bashadmin pts/1 192.168.1.201 14:30 0.00s 0.45s 0.01s wapp pts/2 192.168.1.202 15:00 30:00 1.23s 1.23s python app.py# 案例3:查看系统启动时间$ who -b system boot 2023-08-27 01:07# 案例4:查看运行级别$ who -r run-level 3 2023-08-27 01:07故障排查场景:
# 场景1:安全审计$ who# 检查是否有异常登录# 场景2:系统卡顿$ w# 查看用户在做什么,JCPU/PCPU占用# 场景3:无法登录$ who# 检查是否达到最大登录数# 场景4:找出占用资源的用户$ w | sort -k6 -rn# 按JCPU排序功能:显示用户登录历史记录
语法:
last [选项] [用户名]常用选项:
-n N:显示最近N条-f FILE:指定日志文件-t YYYYMMDDHHMMSS:显示到指定时间-x:显示系统关机/重启记录实战案例:
# 案例1:查看登录历史$ lastadmin pts/1 192.168.1.201 Mon Jan 1 14:30 still logged inroot pts/0 192.168.1.200 Mon Jan 1 10:00 still logged inadmin pts/1 192.168.1.201 Sun Dec 31 18:00 - 22:00 (04:00)reboot system boot 5.10.0-21-amd64 Sun Dec 31 17:55 still running# 案例2:查看特定用户$ last adminadmin pts/1 192.168.1.201 Mon Jan 1 14:30 still logged inadmin pts/1 192.168.1.201 Sun Dec 31 18:00 - 22:00 (04:00)admin pts/0 192.168.1.201 Sun Dec 31 10:00 - 12:00 (02:00)# 案例3:查看最近10条$ last -n 10# 案例4:查看重启记录$ last rebootreboot system boot 5.10.0-21-amd64 Sun Dec 31 17:55 still runningreboot system boot 5.10.0-21-amd64 Sat Dec 30 03:00 - 17:50 (14:50)# 案例5:查看系统关机记录$ last -x | grep shutdownshutdown system down 5.10.0-21-amd64 Sat Dec 30 17:50 - 17:55 (00:05)故障排查场景:
# 场景1:安全事件调查$ last | grep "192.168.1.100"# 查看某IP的登录记录# 场景2:系统异常重启$ last reboot# 查看重启时间,对比日志# 场景3:用户行为审计$ last admin | head -20# 查看用户登录模式# 场景4:找出登录失败$ lastb # 查看失败登录记录功能:显示内核环形缓冲区的消息
语法:
dmesg [选项]常用选项:
-T:显示人类可读的时间戳-H:人类可读格式-l LEVEL:按级别过滤-f FACILITY:按设施过滤-w:持续监控-c:清空缓冲区实战案例:
# 案例1:查看内核日志$ dmesg | tail -20[1234567.890123] Out of memory: Kill process 12345 (java) score 890 or sacrifice child[1234567.890456] Killed process 12345 (java) total-vm:4194304kB, anon-rss:2097152kB, file-rss:0kB# 案例2:人类可读格式$ dmesg -T[Mon Jan 1 15:30:45 2024] Out of memory: Kill process 12345 (java)# 案例3:查看错误信息$ dmesg -l err[Mon Jan 1 15:30:45 2024] EXT4-fs error (device sda1): ext4_find_entry:1234: inode #12345: comm mysqld: reading directory lblock 0# 案例4:查看硬件信息$ dmesg | grep -i "eth0"[ 2.345678] eth0: link up, 1000Mbps, full-duplex# 案例5:持续监控$ dmesg -w# 类似tail -f,实时显示新消息# 案例6:查看OOM信息$ dmesg | grep -i "out of memory"日志级别:
emerg (0):系统不可用alert (1):必须立即采取行动crit (2):严重情况err (3):错误情况warn (4):警告情况notice (5):正常但重要的情况info (6):信息性消息debug (7):调试级别消息故障排查场景:
# 场景1:系统崩溃$ dmesg | grep -i "panic\|oops\|bug"# 场景2:内存不足$ dmesg | grep -i "oom\|out of memory"# 场景3:硬盘错误$ dmesg | grep -i "error\|fail" | grep -i "sd[a-z]"# 场景4:网卡问题$ dmesg | grep -i "eth\|link"# 场景5:USB设备$ dmesg | grep -i "usb"功能:查询和显示systemd日志
语法:
journalctl [选项]常用选项:
-u UNIT:查看特定服务-f:实时跟踪-n N:显示最后N行-p PRIORITY:按优先级过滤--since:起始时间--until:结束时间-b:本次启动的日志-k:内核日志-r:反向显示(最新在前)实战案例:
# 案例1:查看系统日志$ journalctl -n 50-- Logs begin at Sun 2023-08-27 01:07:15 CST, end at Mon 2024-01-01 15:30:45 CST. --Jan 01 15:30:45 server1 sshd[12345]: Accepted password for admin from 192.168.1.201Jan 01 15:30:45 server1 systemd[1]: Started Session 123 of user admin.# 案例2:查看特定服务$ journalctl -u nginxJan 01 15:00:00 server1 nginx[1234]: 2024/01/01 15:00:00 [error] 1234#1234: *123 connect() failed (111: Connection refused)# 案例3:实时跟踪$ journalctl -f# 类似tail -f# 案例4:查看特定时间段$ journalctl --since "2024-01-01 14:00:00" --until"2024-01-01 15:00:00"# 案例5:查看今天的日志$ journalctl --since today# 案例6:查看昨天的日志$ journalctl --since yesterday --until today# 案例7:查看本次启动的日志$ journalctl -b# 案例8:查看上次启动的日志$ journalctl -b -1# 案例9:查看错误日志$ journalctl -p err# 案例10:查看内核日志$ journalctl -k# 案例11:按进程ID查看$ journalctl _PID=1234# 案例12:导出日志$ journalctl -u nginx --since today > nginx.log优先级:
0: emerg(紧急)1: alert(警报)2: crit(严重)3: err(错误)4: warning(警告)5: notice(注意)6: info(信息)7: debug(调试)故障排查场景:
# 场景1:服务启动失败$ journalctl -u nginx -n 50# 查看nginx最近50条日志# 场景2:系统启动慢$ journalctl -b | grep "Startup finished"# 查看启动时间# 场景3:查找错误$ journalctl -p err --since today# 场景4:服务异常重启$ journalctl -u mysql --since "1 hour ago"# 场景5:磁盘满$ journalctl --disk-usage# 查看日志占用空间# 清理日志$ journalctl --vacuum-time=7d # 保留7天$ journalctl --vacuum-size=1G # 保留1GB功能:控制systemd系统和服务管理器
语法:
systemctl [选项] 命令 [服务名]常用命令:
start:启动服务stop:停止服务restart:重启服务reload:重新加载配置status:查看状态enable:开机自启disable:禁用自启is-active:是否运行is-enabled:是否自启list-units:列出单元实战案例:
# 案例1:查看服务状态$ systemctl status nginx● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2024-01-01 10:00:00 CST; 5h 30min ago Docs: man:nginx(8) Process: 1234 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Process: 1235 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Main PID: 1236 (nginx) Tasks: 5 (limit: 4915) Memory: 12.3M CGroup: /system.slice/nginx.service ├─1236 nginx: master process /usr/sbin/nginx -g daemon on; master_process on; ├─1237 nginx: worker process └─1238 nginx: worker process# 案例2:启动服务$ systemctl start nginx# 案例3:停止服务$ systemctl stop nginx# 案例4:重启服务$ systemctl restart nginx# 案例5:重新加载配置$ systemctl reload nginx# 案例6:设置开机自启$ systemctl enable nginxCreated symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /lib/systemd/system/nginx.service.# 案例7:禁用开机自启$ systemctl disable nginx# 案例8:查看所有服务$ systemctl list-units --type=serviceUNIT LOAD ACTIVE SUB DESCRIPTIONnginx.service loaded active running A high performance web servermysql.service loaded active running MySQL Community Serversshd.service loaded active running OpenSSH server daemon# 案例9:查看失败的服务$ systemctl --failedUNIT LOAD ACTIVE SUB DESCRIPTIONapache2.service loaded failed failed The Apache HTTP Server# 案例10:查看服务依赖$ systemctl list-dependencies nginx# 案例11:查看服务日志$ systemctl status nginx -l# 或$ journalctl -u nginx故障排查场景:
# 场景1:服务无法启动$ systemctl status nginx# 查看错误信息$ journalctl -u nginx -n 50# 查看详细日志# 场景2:服务异常停止$ systemctl status mysql# 查看状态和最后日志# 场景3:开机服务未启动$ systemctl is-enabled nginxdisabled # 未设置自启$ systemctl enable nginx# 设置自启# 场景4:服务启动慢$ systemd-analyze blame# 查看启动时间# 场景5:配置文件错误$ systemctl daemon-reload# 重新加载配置$ systemctl restart nginx功能:查询和修改系统时间和日期设置
语法:
timedatectl [选项] [命令]常用命令:
status:显示当前设置set-time:设置时间set-timezone:设置时区set-ntp:启用/禁用NTPlist-timezones:列出时区实战案例:
# 案例1:查看时间设置$ timedatectl Local time: Mon 2024-01-01 15:30:45 CST Universal time: Mon 2024-01-01 07:30:45 UTC RTC time: Mon 2024-01-01 07:30:45 Time zone: Asia/Shanghai (CST, +0800)System clock synchronized: yes NTP service: active RTC inlocal TZ: no# 案例2:设置时区$ timedatectl set-timezone Asia/Shanghai# 案例3:列出所有时区$ timedatectl list-timezonesAfrica/AbidjanAfrica/Accra...Asia/Shanghai...# 案例4:设置时间$ timedatectl set-time "2024-01-01 15:30:45"# 案例5:启用NTP同步$ timedatectl set-ntp true# 案例6:禁用NTP同步$ timedatectl set-ntp false故障排查场景:
# 场景1:时间不准确$ timedatectl# 检查NTP是否启用$ timedatectl set-ntp true# 启用NTP同步# 场景2:时区错误$ timedatectl# 查看当前时区$ timedatectl set-timezone Asia/Shanghai# 设置正确时区# 场景3:证书过期$ timedatectl# 检查系统时间是否正确# 场景4:日志时间对不上$ timedatectl# 确认时区设置功能:显示当前进程的快照
语法:
ps [选项]常用选项:
aux:显示所有进程(BSD风格)-ef:显示所有进程(System V风格)-eLf:显示线程--sort:排序-o:自定义输出-p PID:指定进程-u USER:指定用户-C CMD:指定命令实战案例:
# 案例1:查看所有进程$ ps auxUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.1 185728 9876 ? Ss Jan01 0:12 /sbin/initmysql 1234 45.2 15.3 2621440 1310720 ? Sl 10:00 125:34 /usr/sbin/mysqldapp 5678 12.3 8.5 1048576 524288 ? Sl 14:00 45:12 java -jar app.jar# 案例2:按CPU排序$ ps aux --sort=-%cpu | head -10# 显示CPU占用最高的10个进程# 案例3:按内存排序$ ps aux --sort=-%mem | head -10# 案例4:查看进程树$ ps auxf# 或$ ps -ejH# 案例5:查看线程$ ps -eLf# 或$ ps -T -p 1234# 案例6:自定义输出$ ps -eo pid,ppid,cmd,%cpu,%mem,stat,start PID PPID CMD %CPU %MEM STAT STARTED 1 0 /sbin/init 0.0 0.1 Ss Jan01 1234 1 /usr/sbin/mysqld 45.2 15.3 Sl 10:00# 案例7:查看特定用户的进程$ ps -u mysql# 案例8:查看特定进程$ ps -p 1234 -o pid,ppid,cmd,%cpu,%mem# 案例9:查找进程$ ps aux | grep nginxroot 1234 0.0 0.1 12345 6789 ? Ss 10:00 0:00 nginx: master processwww-data 1235 0.0 0.2 12345 8901 ? S 10:00 0:12 nginx: worker process# 案例10:统计进程数$ ps aux | wc -l234 # 共234个进程STAT字段说明:
R: 运行中(Running)S: 可中断睡眠(Sleeping)D: 不可中断睡眠(Disk sleep)T: 停止(Stopped)Z: 僵尸进程(Zombie)<: 高优先级N: 低优先级L: 有页面锁定在内存s: 会话领导者l: 多线程+: 前台进程组故障排查场景:
# 场景1:CPU 100%$ ps aux --sort=-%cpu | head -10# 找出CPU占用最高的进程# 场景2:内存不足$ ps aux --sort=-%mem | head -10# 找出内存占用最高的进程# 场景3:僵尸进程$ ps aux | grep Z# 查找僵尸进程# 场景4:进程不存在$ ps aux | grep nginx# 确认进程是否运行# 场景5:进程关系$ ps auxf | grep -A 5 nginx# 查看进程树功能:以树状图显示进程关系
语法:
pstree [选项] [pid|user]常用选项:
-p:显示PID-a:显示命令行参数-u:显示用户切换-h:高亮当前进程-n:按PID排序-s:显示父进程实战案例:
# 案例1:查看进程树$ pstreesystemd─┬─ModemManager───2*[{ModemManager}] ├─NetworkManager───2*[{NetworkManager}] ├─accounts-daemon───2*[{accounts-daemon}] ├─nginx───2*[nginx] ├─mysqld───20*[{mysqld}] └─sshd───sshd───bash───pstree# 案例2:显示PID$ pstree -psystemd(1)─┬─ModemManager(1234)─┬─{ModemManager}(1235) │ └─{ModemManager}(1236) ├─nginx(5678)─┬─nginx(5679) │ └─nginx(5680) └─mysqld(9012)─┬─{mysqld}(9013) ├─{mysqld}(9014) └─{mysqld}(9015)# 案例3:显示命令行$ pstree -asystemd ├─nginx -g daemon on; │ ├─nginx -g daemon on; │ └─nginx -g daemon on; └─mysqld --defaults-file=/etc/mysql/my.cnf# 案例4:查看特定进程的树$ pstree -p 1234nginx(1234)─┬─nginx(1235) └─nginx(1236)# 案例5:查看特定用户的进程树$ pstree mysqlmysqld─┬─{mysqld} ├─{mysqld} └─{mysqld}# 案例6:高亮显示$ pstree -h# 高亮当前进程及其祖先故障排查场景:
# 场景1:查找父进程$ pstree -p -s 1234# 显示进程1234的父进程链# 场景2:查看进程关系$ pstree -p | grep nginx# 查看nginx的进程结构# 场景3:僵尸进程$ pstree -p | grep defunct# 查找僵尸进程及其父进程# 场景4:进程泄漏$ pstree -p mysql# 查看mysql是否有异常多的子进程功能:实时显示系统和进程信息
语法:
top [选项]htop [选项]top常用选项:
-d N:刷新间隔N秒-p PID:只监控指定进程-u USER:只监控指定用户-H:显示线程-b:批处理模式-n N:刷新N次后退出top交互式快捷键:
P:按CPU排序M:按内存排序T:按运行时间排序k:杀死进程r:调整nice值1:显示每个CPUc:显示完整命令h:帮助q:退出实战案例:
# 案例1:基础监控$ toptop - 15:30:45 up 127 days, 14:23, 3 users, load average: 2.5, 1.8, 1.2Tasks: 234 total, 2 running, 232 sleeping, 0 stopped, 0 zombie%Cpu(s): 45.2 us, 15.3 sy, 0.0 ni, 35.5 id, 3.2 wa, 0.0 hi, 0.8 si, 0.0 stMiB Mem : 15872.5 total, 2048.3 free, 10240.2 used, 3584.0 buff/cacheMiB Swap: 8192.0 total, 4096.0 free, 4096.0 used. 4608.3 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1234 mysql 20 0 2.5g 1.2g 100m R 95.3 15.2 125:34.56 mysqld 5678 app 20 0 1.0g 512m 50m S 12.3 8.5 45:12.34 java# 案例2:监控特定进程$ top -p 1234# 只显示PID 1234# 案例3:显示线程$ top -H -p 1234# 显示进程1234的所有线程# 案例4:批处理模式$ top -b -n 1 > top.log# 输出一次快照到文件# 案例5:监控特定用户$ top -u mysql# 只显示mysql用户的进程htop优势:
✓ 彩色界面✓ 支持鼠标✓ 显示所有CPU核心✓ 树形显示进程✓ 可以横向/纵向滚动✓ 更直观的操作故障排查场景:
# 场景1:CPU 100%$ top# 按P键,找出CPU占用最高的进程# 场景2:内存不足$ top# 按M键,找出内存占用最高的进程# 场景3:系统卡顿$ top# 查看load average和wa(IO等待)# 场景4:进程异常$ top -H -p 1234# 查看进程的线程情况功能:根据名称和属性查找进程
语法:
pgrep [选项] 模式常用选项:
-l:显示进程名-a:显示完整命令-u USER:指定用户-x:精确匹配-f:匹配完整命令行-n:最新的进程-o:最老的进程-c:计数实战案例:
# 案例1:查找进程$ pgrep nginx123412351236# 案例2:显示进程名$ pgrep -l nginx1234 nginx1235 nginx1236 nginx# 案例3:显示完整命令$ pgrep -a nginx1234 nginx: master process /usr/sbin/nginx1235 nginx: worker process1236 nginx: worker process# 案例4:查找特定用户的进程$ pgrep -u mysql12345678# 案例5:精确匹配$ pgrep -x nginx1234 # 只匹配进程名完全是nginx的# 案例6:匹配完整命令行$ pgrep -f "java.*app.jar"5678# 案例7:查找最新的进程$ pgrep -n nginx1236 # 最新启动的nginx进程# 案例8:统计进程数$ pgrep -c nginx3 # 共3个nginx进程故障排查场景:
# 场景1:检查进程是否运行$ pgrep nginx# 有输出说明运行,无输出说明未运行# 场景2:查找僵尸进程$ ps aux | grep Z | awk '{print $2}' | xargs pgrep -P# 查找僵尸进程的父进程# 场景3:批量操作$ pgrep nginx | xargs kill -HUP# 给所有nginx进程发送HUP信号# 场景4:监控进程数$ watch -n 1 'pgrep -c java'# 每秒显示java进程数功能:根据名称和属性终止进程
语法:
pkill [选项] 模式常用选项:
-signal:指定信号-u USER:指定用户-x:精确匹配-f:匹配完整命令行-n:最新的进程-o:最老的进程实战案例:
# 案例1:终止进程$ pkill nginx# 终止所有nginx进程# 案例2:指定信号$ pkill -HUP nginx# 给nginx发送HUP信号(重新加载配置)$ pkill -9 java# 强制终止java进程# 案例3:终止特定用户的进程$ pkill -u app# 终止app用户的所有进程# 案例4:精确匹配$ pkill -x nginx# 只终止进程名完全是nginx的# 案例5:匹配完整命令行$ pkill -f "java.*app.jar"# 终止匹配的java进程# 案例6:终止最新的进程$ pkill -n nginx# 终止最新启动的nginx进程常用信号:
-1 (HUP):重新加载配置-2 (INT):中断(Ctrl+C)-9 (KILL):强制终止-15 (TERM):正常终止(默认)-STOP:暂停进程-CONT:继续进程故障排查场景:
# 场景1:重启服务$ pkill -HUP nginx# 重新加载nginx配置# 场景2:清理僵尸进程$ pkill -9 defunct# 强制终止僵尸进程(通常无效,需要终止父进程)# 场景3:批量终止$ pkill -u app# 终止某用户的所有进程# 场景4:紧急情况$ pkill -9 java# 强制终止所有java进程功能:向进程发送信号
语法:
kill [选项] PIDkillall [选项] 进程名常用选项:
-l:列出所有信号-s SIGNAL:指定信号-9:强制终止-15:正常终止(默认)实战案例:
# 案例1:终止进程$ kill 1234# 正常终止进程1234# 案例2:强制终止$ kill -9 1234# 强制终止进程1234# 案例3:重新加载配置$ kill -HUP 1234# 给进程1234发送HUP信号# 案例4:列出所有信号$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR213) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT...# 案例5:使用killall$ killall nginx# 终止所有名为nginx的进程$ killall -9 java# 强制终止所有java进程# 案例6:批量终止$ ps aux | grep defunct | awk '{print $2}' | xargs kill -9# 强制终止所有僵尸进程信号说明:
SIGHUP (1):挂起,通常用于重新加载配置SIGINT (2):中断(Ctrl+C)SIGQUIT (3):退出(Ctrl+\)SIGKILL (9):强制终止,不能被捕获SIGTERM (15):正常终止,可以被捕获(默认)SIGSTOP (19):暂停,不能被捕获SIGCONT (18):继续故障排查场景:
# 场景1:进程无响应$ kill 1234# 先尝试正常终止$ kill -9 1234# 如果无效,强制终止# 场景2:重启服务$ kill -HUP $(cat /var/run/nginx.pid)# 重新加载nginx配置# 场景3:清理进程$ killall -9 defunct# 尝试清理僵尸进程# 场景4:批量操作$ pgrep java | xargs kill -15# 正常终止所有java进程功能:查找正在运行的程序的进程ID
语法:
pidof [选项] 程序名实战案例:
# 案例1:查找进程ID$ pidof nginx1234 1235 1236# 案例2:只返回一个PID$ pidof -s nginx1234# 案例3:用于脚本$ kill $(pidof nginx)# 终止所有nginx进程$ if pidof nginx > /dev/null; thenecho"nginx is running"elseecho"nginx is not running"fi功能:设置或调整进程优先级
语法:
nice -n 优先级 命令renice 优先级 -p PID实战案例:
# 案例1:以低优先级运行$ nice -n 19 ./backup.sh# nice值19(最低优先级)# 案例2:以高优先级运行$ nice -n -20 ./critical_task.sh# nice值-20(最高优先级,需root)# 案例3:调整已运行进程$ renice 10 -p 1234# 将进程1234的nice值调整为10# 案例4:批量调整$ renice 15 -u app# 将app用户的所有进程nice值调整为15nice值说明:
-20到19:数值越小,优先级越高-20:最高优先级(需root)0:默认优先级19:最低优先级功能:使命令在退出登录后继续运行
语法:
nohup 命令 &实战案例:
# 案例1:后台运行$ nohup ./long_task.sh &[1] 1234nohup: ignoring input and appending output to 'nohup.out'# 案例2:指定输出文件$ nohup ./task.sh > task.log 2>&1 &# 案例3:查看输出$ tail -f nohup.out# 案例4:结合nice使用$ nohupnice -n 19 ./backup.sh &功能:终端复用器,保持会话
语法:
screen [选项]tmux [选项]screen常用命令:
# 创建会话$ screen -S session_name# 列出会话$ screen -ls# 恢复会话$ screen -r session_name# 分离会话:Ctrl+A, D# 终止会话$ screen -X -S session_name quittmux常用命令:
# 创建会话$ tmux new -s session_name# 列出会话$ tmux ls# 恢复会话$ tmux attach -t session_name# 分离会话:Ctrl+B, D# 终止会话$ tmux kill-session -t session_name故障排查场景:
# 场景1:长时间任务$ screen -S backup$ ./backup.sh# Ctrl+A, D 分离会话# 场景2:远程维护$ tmux new -s maintenance$ systemctl restart mysql# 即使断开连接,任务继续执行# 场景3:多窗口监控$ tmux new -s monitor# Ctrl+B, C 创建新窗口# Ctrl+B, N 切换窗口功能:显示文件系统磁盘空间使用情况
语法:
df [选项]常用选项:
-h:人类可读格式-i:显示inode信息-T:显示文件系统类型-t TYPE:只显示指定类型-x TYPE:排除指定类型实战案例:
# 案例1:查看磁盘空间$ df -hFilesystem Size Used Avail Use% Mounted on/dev/sda1 50G 45G 3.0G 94% //dev/sda2 100G 80G 15G 85% /datatmpfs 7.8G 123M 7.7G 2% /dev/shm# 案例2:查看inode使用$ df -hiFilesystem Inodes IUsed IFree IUse% Mounted on/dev/sda1 3.2M 3.1M 100K 97% //dev/sda2 6.4M 5.8M 600K 91% /data# 案例3:显示文件系统类型$ df -hTFilesystem Type Size Used Avail Use% Mounted on/dev/sda1 ext4 50G 45G 3.0G 94% //dev/sda2 xfs 100G 80G 15G 85% /data故障排查场景:
# 场景1:磁盘满$ df -h# Use% > 90%,需要清理# 场景2:inode耗尽$ df -hi# IUse% > 90%,即使空间充足也无法创建文件# 场景3:找出大文件$ df -h# 确定哪个分区满了$ du -h /data | sort -rh | head -20# 找出大目录功能:估算文件和目录的磁盘使用空间
语法:
du [选项] [目录/文件]常用选项:
-h:人类可读格式-s:只显示总计-c:显示总计-a:显示所有文件-d N:最大深度N层--max-depth=N:同-d实战案例:
# 案例1:查看目录大小$ du -sh /data80G /data# 案例2:查看子目录$ du -h --max-depth=1 /data | sort -rh80G /data50G /data/mysql20G /data/logs10G /data/backup# 案例3:找出最大的10个目录$ du -h /data | sort -rh | head -10# 案例4:查看所有文件$ du -ah /data | sort -rh | head -20# 案例5:排除某些目录$ du -sh --exclude='*.log' /data故障排查场景:
# 场景1:磁盘满,找出大目录$ du -h --max-depth=1 / | sort -rh | head -10# 场景2:找出大文件$ find /data -type f -size +1G -execdu -h {} \; | sort -rh# 场景3:快速定位$ du -h /data 2>/dev/null | grep '^[0-9.]*G' | sort -rh功能:列出打开的文件和进程
语法:
lsof [选项] [文件]常用选项:
-p PID:指定进程-u USER:指定用户-c CMD:指定命令-i:网络连接+D DIR:目录下的所有文件-t:只显示PID实战案例:
# 案例1:查看进程打开的文件$ lsof -p 1234# 案例2:查看文件被哪些进程打开$ lsof /var/lib/mysql/ibdata1# 案例3:查看网络连接$ lsof -i$ lsof -i :3306 # 查看3306端口# 案例4:查看目录下打开的文件$ lsof +D /data# 案例5:恢复删除的文件$ lsof | grep deleted$ cp /proc/1234/fd/10 /path/to/recover故障排查场景:
# 场景1:文件被占用无法删除$ lsof /path/to/file# 找出占用文件的进程# 场景2:磁盘满但du显示空间充足$ lsof | grep deleted# 查找已删除但未释放的文件# 场景3:端口被占用$ lsof -i :80# 查看80端口被哪个进程占用# 场景4:进程打开文件过多$ lsof -p 1234 | wc -l# 统计进程打开的文件数功能:显示使用指定文件或文件系统的进程
语法:
fuser [选项] 文件/目录常用选项:
-v:详细模式-m:显示使用文件系统的所有进程-k:终止使用文件的进程-i:交互式终止实战案例:
# 案例1:查看文件使用者$ fuser /var/lib/mysql/ibdata1/var/lib/mysql/ibdata1: 1234# 案例2:详细信息$ fuser -v /var/lib/mysql/ibdata1 USER PID ACCESS COMMAND/var/lib/mysql/ibdata1: mysql 1234 F.... mysqld# 案例3:查看文件系统使用者$ fuser -m /data/data: 1234c 5678c 9012c# 案例4:终止使用文件的进程$ fuser -k /var/lib/mysql/ibdata1# 案例5:交互式终止$ fuser -ki /var/lib/mysql/ibdata1故障排查场景:
# 场景1:无法卸载文件系统$ fuser -m /data# 查看哪些进程在使用$ fuser -km /data# 终止所有使用该文件系统的进程# 场景2:文件被锁定$ fuser -v /path/to/file# 查看哪个进程锁定了文件功能:在目录树中查找文件
语法:
find [路径] [选项] [表达式]常用选项:
-name:按名称查找-type:按类型查找(f文件/d目录)-size:按大小查找-mtime:按修改时间查找-user:按用户查找-perm:按权限查找-exec:对结果执行命令实战案例:
# 案例1:按名称查找$ find /data -name "*.log"# 案例2:查找大文件$ find /data -type f -size +1G# 案例3:查找最近修改的文件$ find /data -type f -mtime -1# 最近1天修改的文件# 案例4:查找并删除$ find /data -name "*.tmp" -delete# 案例5:查找并执行$ find /data -name "*.log" -mtime +30 -execrm {} \;# 删除30天前的日志# 案例6:查找空文件$ find /data -type f -empty# 案例7:按权限查找$ find /data -perm 777# 案例8:按用户查找$ find /data -user mysql故障排查场景:
# 场景1:磁盘满,找大文件$ find / -type f -size +1G -execls -lh {} \; 2>/dev/null# 场景2:清理临时文件$ find /tmp -type f -mtime +7 -delete# 场景3:查找最近修改的配置$ find /etc -type f -mtime -1# 场景4:权限问题$ find /data -type f ! -perm 644# 查找权限不是644的文件# 更新数据库$ updatedb# 查找文件$ locate nginx.conf# 忽略大小写$ locate -i NGINX.CONF# 查看文件详细信息$ stat /etc/passwd File: /etc/passwd Size: 2345 Blocks: 8 IO Block: 4096 regular fileDevice: 801h/2049d Inode: 123456 Links: 1Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2024-01-01 10:00:00.000000000 +0800Modify: 2024-01-01 09:00:00.000000000 +0800Change: 2024-01-01 09:00:00.000000000 +0800# 识别文件类型$ file /bin/ls/bin/ls: ELF 64-bit LSB executable$ file image.jpgimage.jpg: JPEG image data$ file script.shscript.sh: Bourne-Again shell script, ASCII text executable# 查看挂载$ mount/dev/sda1 on / type ext4 (rw,relatime)/dev/sda2 on /data type xfs (rw,relatime)# 挂载文件系统$ mount /dev/sdb1 /mnt# 卸载$ umount /mnt# 查看块设备$ lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTsda 8:0 0 100G 0 disk├─sda1 8:1 0 50G 0 part /└─sda2 8:2 0 50G 0 part /datasdb 8:16 0 500G 0 disk└─sdb1 8:17 0 500G 0 part /backup功能:测试网络连通性和延迟
语法:
ping [选项] 目标实战案例:
# 案例1:基础测试$ ping -c 4 192.168.1.1PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.234 ms64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.345 ms64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.456 ms64 bytes from 192.168.1.1: icmp_seq=4 ttl=64 time=0.567 ms--- 192.168.1.1 ping statistics ---4 packets transmitted, 4 received, 0% packet loss, time 3005msrtt min/avg/max/mdev = 0.234/0.400/0.567/0.134 ms# 案例2:大包测试MTU$ ping -c 10 -s 1472 192.168.1.1# 案例3:快速测试$ ping -c 100 -i 0.2 192.168.1.1故障排查:
# 网络不通$ ping 192.168.1.1 # 测试网关$ ping 8.8.8.8 # 测试外网$ ping www.baidu.com # 测试DNS# 丢包率高$ ping -c 100 192.168.1.1# 查看packet loss百分比# 延迟高$ ping 192.168.1.1# 查看time值功能:追踪数据包到达目标的路径
语法:
traceroute [选项] 目标tracepath 目标实战案例:
# 案例1:追踪路由$ traceroute 8.8.8.8traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets 1 192.168.1.1 (192.168.1.1) 0.567 ms 0.456 ms 0.345 ms 2 10.0.0.1 (10.0.0.1) 2.345 ms 2.234 ms 2.123 ms 3 61.144.1.1 (61.144.1.1) 5.678 ms 5.567 ms 5.456 ms 4 202.97.1.1 (202.97.1.1) 12.345 ms 12.234 ms 12.123 ms 5 8.8.8.8 (8.8.8.8) 15.678 ms 15.567 ms 15.456 ms# 案例2:使用tracepath(不需root)$ tracepath 8.8.8.8故障排查:
# 网络慢$ traceroute 目标IP# 查看哪一跳延迟高# 网络不通$ traceroute 目标IP# 查看在哪一跳中断功能:结合ping和traceroute的网络诊断工具
语法:
mtr [选项] 目标实战案例:
# 案例1:交互式诊断$ mtr 8.8.8.8 My traceroute [v0.92]server1 (192.168.1.100) 2024-01-01T15:30:15+0800Keys: Help Display mode Restart statistics Order of fields quit Packets Pings Host Loss% Snt Last Avg Best Wrst StDev 1. 192.168.1.1 0.0% 10 0.5 0.6 0.4 1.2 0.2 2. 10.0.0.1 0.0% 10 2.3 2.5 2.1 3.4 0.4 3. 8.8.8.8 0.0% 10 15.6 15.8 15.2 17.3 0.7# 案例2:报告模式$ mtr -r -c 100 8.8.8.8故障排查:
# 网络质量差$ mtr -r -c 100 目标IP# 查看Loss%和StDev(抖动)# 定位问题节点$ mtr 目标IP# 找出Loss%高或延迟突增的跳功能:DNS查询工具
语法:
nslookup 域名dig 域名host 域名实战案例:
# 案例1:nslookup查询$ nslookup www.baidu.comServer: 192.168.1.1Address: 192.168.1.1#53Non-authoritative answer:Name: www.baidu.comAddress: 14.215.177.38Name: www.baidu.comAddress: 14.215.177.39# 案例2:dig查询$ dig www.baidu.com; <<>> DiG 9.16.1 <<>> www.baidu.com;; ANSWER SECTION:www.baidu.com. 300 IN A 14.215.177.38www.baidu.com. 300 IN A 14.215.177.39# 案例3:host查询$ host www.baidu.comwww.baidu.com has address 14.215.177.38www.baidu.com has address 14.215.177.39# 案例4:反向查询$ dig -x 8.8.8.8# 案例5:指定DNS服务器$ dig @8.8.8.8 www.baidu.com故障排查:
# DNS解析失败$ nslookup www.example.com# 检查是否能解析# DNS服务器问题$ dig @8.8.8.8 www.example.com$ dig @114.114.114.114 www.example.com# 对比不同DNS服务器的结果# 查看DNS缓存$ dig www.example.com# 查看TTL值功能:显示网络连接、路由表、接口统计
语法:
netstat [选项]ss [选项]实战案例:
# 案例1:查看所有TCP连接$ netstat -ant$ ss -ant# 案例2:查看监听端口$ netstat -tlnp$ ss -tlnp# 案例3:统计连接状态$ netstat -ant | awk '{print $6}' | sort | uniq -c | sort -rn 234 ESTABLISHED 45 TIME_WAIT 12 LISTEN# 案例4:查看特定端口$ netstat -ant | grep :3306$ ss -ant | grep :3306# 案例5:查看路由表$ netstat -rn$ ip route故障排查:
# 端口未监听$ ss -tlnp | grep :80# 检查服务是否启动# 连接数过多$ ss -ant | grep ESTABLISHED | wc -l# TIME_WAIT过多$ ss -ant | grep TIME_WAIT | wc -l# 找出连接最多的IP$ netstat -ant | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10# 查看IP地址$ ip addr show# 查看路由$ ip route show# 添加IP$ ip addr add 192.168.1.100/24 dev eth0# 启用网卡$ ip linkset eth0 up# 查看路由表$ route -n# 添加路由$ route add -net 192.168.2.0/24 gw 192.168.1.1# 删除路由$ route del -net 192.168.2.0/24# 查看ARP缓存$ arp -nAddress HWtype HWaddress Flags Mask Iface192.168.1.1 ether 00:11:22:33:44:55 C eth0# 删除ARP条目$ arp -d 192.168.1.1# 抓包$ tcpdump -i eth0 -w capture.pcap# 抓特定端口$ tcpdump -i eth0 port 80# 抓特定主机$ tcpdump -i eth0 host 192.168.1.100# 显示内容$ tcpdump -i eth0 -A port 80# 测试端口$ nc -zv 192.168.1.100 80Connection to 192.168.1.100 80 port [tcp/http] succeeded!# 监听端口$ nc -l 8080# 传输文件# 接收端$ nc -l 8080 > file.tar.gz# 发送端$ nc 192.168.1.100 8080 < file.tar.gz功能:显示文件的最后几行
语法:
tail [选项] 文件常用选项:
-n N:显示最后N行-f:实时跟踪文件-F:跟踪文件名(文件轮转后继续跟踪)-c N:显示最后N字节实战案例:
# 案例1:查看最后10行$ tail /var/log/syslog# 案例2:查看最后50行$ tail -n 50 /var/log/nginx/access.log# 案例3:实时跟踪$ tail -f /var/log/mysql/error.log# 案例4:跟踪多个文件$ tail -f /var/log/nginx/*.log# 案例5:从第100行开始显示$ tail -n +100 /var/log/syslog故障排查:
# 查看最新错误$ tail -n 100 /var/log/syslog | grep -i error# 实时监控日志$ tail -f /var/log/nginx/error.log# 查看服务启动日志$ tail -n 50 /var/log/mysql/error.log# 查看前10行$ head /var/log/syslog# 查看前50行$ head -n 50 /var/log/nginx/access.log# 查看前1000字节$ head -c 1000 file.log# 分页查看$ less /var/log/syslog# 空格:下一页# b:上一页# /pattern:搜索# n:下一个匹配# q:退出# more(简单版)$ more /var/log/syslog功能:在文件中搜索匹配的行
语法:
grep [选项] 模式 文件常用选项:
-i:忽略大小写-v:反向匹配-n:显示行号-c:统计匹配行数-A N:显示匹配行及后N行-B N:显示匹配行及前N行-C N:显示匹配行及前后N行-r:递归搜索-E:扩展正则表达式实战案例:
# 案例1:搜索错误$ grep -i error /var/log/syslog# 案例2:显示行号$ grep -n "Connection refused" /var/log/nginx/error.log# 案例3:显示上下文$ grep -C 5 "Out of memory" /var/log/syslog# 案例4:统计错误数$ grep -c "ERROR" /var/log/app.log# 案例5:递归搜索$ grep -r "database connection failed" /var/log/# 案例6:多个模式$ grep -E "error|warning|critical" /var/log/syslog# 案例7:排除匹配$ grep -v "DEBUG" /var/log/app.log故障排查:
# 查找错误$ grep -i "error\|fail\|critical" /var/log/syslog# 查找特定时间的日志$ grep "Jan 1 15:" /var/log/syslog# 查找IP$ grep "192.168.1.100" /var/log/nginx/access.log# 统计错误类型$ grep -i error /var/log/app.log | awk '{print $5}' | sort | uniq -c | sort -rn# 提取列$ awk '{print $1, $4}' /var/log/nginx/access.log# 条件过滤$ awk '$9 == 404' /var/log/nginx/access.log# 统计$ awk '{sum+=$10} END {print sum}' /var/log/nginx/access.log# 替换$ sed 's/old/new/g' file.log# 删除行$ sed '/pattern/d' file.log# 提取行$ sed -n '10,20p' file.log# 提取字段$ cut -d' ' -f1,4 /var/log/nginx/access.log# 提取字符$ cut -c1-10 file.log# 排序$ sort file.log# 数字排序$ sort -n file.log# 反向排序$ sort -r file.log# 按列排序$ sort -k2 -n file.log# 去重$ sort file.log | uniq# 统计重复$ sort file.log | uniq -c# 只显示重复的$ sort file.log | uniq -d# 统计行数$ wc -l /var/log/syslog# 统计单词数$ wc -w file.txt# 统计字节数$ wc -c file.txt功能:追踪进程的系统调用和信号
语法:
strace [选项] 命令strace [选项] -p PID常用选项:
-p PID:追踪已运行的进程-f:追踪子进程-e SYSCALL:只追踪指定系统调用-c:统计系统调用-t:显示时间戳-o FILE:输出到文件实战案例:
# 案例1:追踪命令$ strace lsexecve("/bin/ls", ["ls"], 0x7ffd...) = 0open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3...# 案例2:追踪进程$ strace -p 1234select(6, [3 4 5], NULL, NULL, {tv_sec=1, tv_usec=0}) = 1 (in [3], left {tv_sec=0, tv_usec=999123})read(3, "GET / HTTP/1.1\r\n", 8192) = 16...# 案例3:只追踪文件操作$ strace -e open,read,write ls# 案例4:统计系统调用$ strace -c ls% time seconds usecs/call calls errors syscall------ ----------- ----------- --------- --------- ---------------- 45.23 0.000123 5 25 read 23.45 0.000064 4 16 write 12.34 0.000034 3 11 open...# 案例5:追踪网络调用$ strace -e socket,connect,send,recv -p 1234故障排查:
# 程序启动失败$ strace ./program 2>&1 | grep -i "error\|fail"# 程序卡住$ strace -p 1234# 查看卡在哪个系统调用# 文件找不到$ strace -e open program 2>&1 | grep ENOENT# 性能问题$ strace -c -p 1234# 统计系统调用耗时# 追踪库函数调用$ ltrace ls# 追踪进程$ ltrace -p 1234# 统计$ ltrace -c program# 调试程序$ gdb program# 调试core文件$ gdb program core# 附加到进程$ gdb -p 1234# 常用命令(gdb) run # 运行(gdb) break main # 设置断点(gdb) continue# 继续(gdb) backtrace # 查看调用栈(gdb) print var # 打印变量# 查看程序依赖的库$ ldd /bin/ls linux-vdso.so.1 (0x00007ffd...) libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f...) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f...) ...# 检查缺失的库$ ldd program | grep "not found"# 查看符号表$ nm program# 只看函数$ nm -D /lib/x86_64-linux-gnu/libc.so.6 | grep printf# 反汇编$ objdump -d program# 查看段信息$ objdump -h program# 查看符号表$ objdump -t program# 查看ELF头$ readelf -h program# 查看段头$ readelf -S program# 查看符号表$ readelf -s program# 提取可打印字符串$ strings program# 查找特定字符串$ strings program | grep "error"# 从二进制文件中提取配置$ strings /bin/program | grep "config"# 十六进制查看$ hexdump -C file# 只看前100字节$ hexdump -C -n 100 file# 十六进制查看$ xxd file# 转换回二进制$ xxd -r hexfile > binfile# 只看前100字节$ xxd -l 100 file系统故障 ↓1. 快速检查(30秒) $ uptime # 负载 $ df -h # 磁盘 $ free -h # 内存 $ top # 进程 ↓2. 确定问题类型 ├─ CPU高 → 3.1 ├─ 内存不足 → 3.2 ├─ 磁盘满 → 3.3 ├─ 网络问题 → 3.4 └─ 服务异常 → 3.5 ↓3.1 CPU问题排查 $ top # 找出占用CPU的进程 $ ps aux --sort=-%cpu | head -10 # 确认进程 $ pidstat -u -p <pid> 1 # 查看进程CPU使用 $ perf top -p <pid> # 分析热点函数 $ strace -c -p <pid> # 系统调用统计 ↓3.2 内存问题排查 $ free -h # 查看内存使用 $ ps aux --sort=-%mem | head -10 # 找出占用内存的进程 $ pmap -x <pid> # 查看进程内存映射 $ smem -s pss -r | head -10 # 准确的内存占用 $ dmesg | grep -i "out of memory" # 查看OOM ↓3.3 磁盘问题排查 $ df -h # 查看磁盘空间 $ df -hi # 查看inode $ du -h --max-depth=1 / | sort -rh # 找出大目录 $ lsof | grep deleted # 查找已删除未释放的文件 $ find / -type f -size +1G # 查找大文件 ↓3.4 网络问题排查 $ ping 网关 # 测试本地网络 $ ping 8.8.8.8 # 测试外网 $ ping 域名 # 测试DNS $ traceroute 目标 # 追踪路由 $ mtr 目标 # 综合诊断 $ ss -ant | grep ESTABLISHED # 查看连接 $ netstat -s # 查看网络统计 ↓3.5 服务异常排查 $ systemctl status 服务名 # 查看服务状态 $ journalctl -u 服务名 -n 50 # 查看服务日志 $ ps aux | grep 服务名 # 确认进程 $ lsof -i :端口 # 检查端口 $ strace -p <pid> # 追踪系统调用 ↓4. 解决问题 ├─ 重启服务 ├─ 清理资源 ├─ 调整配置 └─ 升级/降级 ↓5. 验证修复 $ 重复步骤1 $ 监控一段时间 ↓6. 记录文档 - 问题现象 - 排查过程 - 解决方案 - 预防措施uptime | ||
top | ||
vmstat 1 | ||
dmesg | tail | ||
journalctl -n 50 |
常见原因:
iostat -x 1ps aux \| grep Dsystemctl status 服务 | ||
journalctl -u 服务 -n 50 | ||
ps aux | grep 服务 | ||
lsof -i :端口 | ||
strace 服务启动命令 |
常见原因:
lsof -i :端口,终止占用进程ldd 程序,检查库依赖df -h | ||
df -hi | ||
du -h --max-depth=1 / | sort -rh | ||
lsof | grep deleted | ||
find / -type f -size +1G |
清理方案:
# 清理日志$ find /var/log -name "*.log" -mtime +30 -delete$ journalctl --vacuum-time=7d# 清理临时文件$ find /tmp -type f -mtime +7 -delete# 清理包缓存$ yum clean all # CentOS$ apt clean # Ubuntu# 恢复已删除未释放的文件$ lsof | grep deleted$ kill -9 <pid> # 终止进程释放空间free -h | ||
ps aux --sort=-%mem | head -10 | ||
smem -s pss -r | head -10 | ||
dmesg | grep -i oom | ||
pmap -x <pid> |
解决方案:
# 清理缓存(谨慎使用)$ echo 3 > /proc/sys/vm/drop_caches# 调整swappiness$ sysctl vm.swappiness=10# 重启占用内存的服务$ systemctl restart 服务# 增加swap$ ddif=/dev/zero of=/swapfile bs=1M count=2048$ mkswap /swapfile$ swapon /swapfileping 网关 | ||
ping 8.8.8.8 | ||
ping 域名 | ||
ip addr | ||
ip route |
排查步骤:
# 1. 检查网卡状态$ ip link show$ ethtool eth0# 2. 检查IP配置$ ip addr show eth0# 3. 检查路由$ ip route show# 4. 检查DNS$ cat /etc/resolv.conf$ nslookup www.baidu.com# 5. 检查防火墙$ iptables -L -n$ firewall-cmd --list-all# 6. 追踪路由$ traceroute 目标IP$ mtr 目标IPps aux | grep Z | ||
ps -eo pid,ppid,stat,cmd | grep Z | ||
pstree -p -s <pid> | ||
kill -9 <ppid> |
说明:
top | ||
ps aux --sort=-%cpu | head -10 | ||
top -H -p <pid> | ||
perf top -p <pid> | ||
strace -c -p <pid> |
解决方案:
# 1. 优化程序# 2. 限制CPU使用$ cpulimit -p <pid> -l 50 # 限制为50%# 3. 调整优先级$ renice 19 -p <pid> # 降低优先级# 4. 重启服务$ systemctl restart 服务lsof -i :端口 | ||
ss -tlnp | grep :端口 | ||
ps aux | grep <pid> | ||
kill <pid> |
示例:
# 80端口被占用$ lsof -i :80COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEnginx 1234 root 6u IPv4 12345 0t0 TCP *:http (LISTEN)# 终止进程$ kill 1234# 或$ systemctl stop nginx查找错误:
# 查找所有错误$ grep -i "error\|fail\|critical" /var/log/syslog# 查找特定时间的错误$ grep "Jan 1 15:" /var/log/syslog | grep -i error# 统计错误类型$ grep -i error /var/log/app.log | awk '{print $5}' | sort | uniq -c | sort -rn# 查找最近的错误$ tail -n 1000 /var/log/syslog | grep -i error分析访问日志:
# 统计访问最多的IP$ awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10# 统计状态码$ awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn# 统计访问最多的URL$ awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10# 统计流量$ awk '{sum+=$10} END {print sum/1024/1024 " MB"}' /var/log/nginx/access.logCPU性能:
$ uptime# 查看负载$ top # 实时监控$ ps aux --sort=-%cpu | head -10 # CPU占用排序$ pidstat -u 1 # 进程CPU统计$ perf top # 热点函数内存性能:
$ free -h # 内存使用$ ps aux --sort=-%mem | head -10 # 内存占用排序$ smem -s pss -r | head -10 # 准确内存统计$ vmstat 1 # 虚拟内存统计$ slabtop # slab缓存磁盘性能:
$ iostat -x 1 # IO统计$ iotop -o # IO监控$ df -h # 磁盘空间$ du -h --max-depth=1 / | sort -rh # 目录大小网络性能:
$ ss -s # 连接统计$ iftop -i eth0 # 流量监控$ nethogs eth0 # 进程流量$ ping 目标 # 延迟测试$ mtr 目标 # 综合诊断快速定位:
系统方法:
1. 收集信息(现象、日志、监控)2. 分析原因(排除法、对比法)3. 提出假设(可能的原因)4. 验证假设(测试、实验)5. 解决问题(修复、优化)6. 验证修复(测试、监控)7. 记录文档(问题、方案)快速检查:
# 一键检查系统状态$ echo"=== 负载 ===" && uptime && \echo"=== 磁盘 ===" && df -h && \echo"=== 内存 ===" && free -h && \echo"=== 进程 ===" && ps aux --sort=-%cpu | head -5日志分析:
# 查找最近的错误$ tail -n 1000 /var/log/syslog | grep -i "error\|fail\|critical" | tail -20# 统计错误频率$ grep -i error /var/log/app.log | awk '{print $1, $2}' | uniq -c | tail -20网络诊断:
# 综合网络检查$ ping -c 4 网关 && ping -c 4 8.8.8.8 && nslookup www.baidu.com服务异常:
# 1. 查看状态$ systemctl status 服务# 2. 查看日志$ journalctl -u 服务 -n 50# 3. 重启服务$ systemctl restart 服务# 4. 验证$ systemctl status 服务系统卡顿:
# 1. 查看负载$ uptime# 2. 查看进程$ top# 3. 查看IO$ iostat -x 1# 4. 查看内存$ free -h# 5. 查看日志$ dmesg | tail磁盘满:
# 1. 查看空间$ df -h# 2. 找大目录$ du -h --max-depth=1 / | sort -rh | head -10# 3. 清理日志$ find /var/log -name "*.log" -mtime +30 -delete# 4. 清理临时文件$ find /tmp -type f -mtime +7 -delete# 5. 验证$ df -h系统检查:
日志分析:
网络基础:
进程管理:
文件系统:
网络诊断:
系统调试:
日志处理:
综合分析:
这60个命令覆盖了Linux故障排查的方方面面:
✅ 系统状态检查(10个)✅ 进程管理(10个)✅ 文件系统检查(10个)✅ 网络诊断(10个)✅ 日志分析(10个)✅ 系统调试(10个)
觉得有用?点个赞👍,转发给更多需要的人!