你掌握哪些 Linux 常用命令?

#计算机网络#操作系统#面试八股

你掌握哪些 Linux 常用命令?

真正有价值的不是背命令清单,而是按排查场景组织:看进程、看 CPU、看内存、看磁盘、看网络、看日志, 每条命令都要能说出"它读的是哪个 /proc 文件、输出里哪个字段是关键"。 下面按六类场景给出最常用的一组,并附一套线上排障的标准动作。

1. 六类场景速查

场景命令关键字段/用法
文件与目录ls -lh、find、du -sh *、statdu 找大目录,find -mtime +7 找旧文件
文本处理grep -n、awk、sed、sort -k、uniq -c、wc -l日志切分统计最常用
进程与资源ps -ef、top -H、pidstat、pstree-H 看线程级 CPU
内存free -m、vmstat 1、/proc/meminfo、smem看 MemAvailable 而非 free
磁盘 IOdf -h、iostat -x 1、iotop、lsof +L1%util、await、被删未释放的文件
网络ss -lntp、ss -s、ping、traceroute、tcpdump、curl -vss 已取代 netstat
性能剖析perf top、strace -c、bpftrace定位系统调用与热点函数
服务管理systemctl status、journalctl -u x -f看退出码与重启次数

2. 排障流程

服务变慢/出错
   │
   ├─► 1. 先看整体水位:uptime(load)、free -m、df -h
   │
   ├─► 2. CPU 高? top -H 找到热点线程 → printf '%x' 取十六进制 →
   │        jstack <pid> | grep -A20 nid=0x<hex>(Java)或 perf top(原生)
   │
   ├─► 3. 内存涨? pmap -x <pid> 看段,jmap/heap 采样,确认是堆还是堆外
   │
   ├─► 4. 磁盘满? df 看挂载点 → du -sh * 逐层下钻 → lsof +L1 找已删除仍占用的文件
   │
   ├─► 5. 网络不通? ss -lntp 看是否监听 → curl -v 看握手 → tcpdump 抓包
   │
   └─► 6. 系统调用慢? strace -c -p <pid> 看哪个 syscall 耗时最多

3. 高频组合

# 找出 CPU 最高的 5 个线程,并换算成十六进制(配合 jstack 用)
ps -eLo pid,tid,pcpu,comm --sort=-pcpu | head -6
printf '%x\n' 12345

# 哪个进程在写磁盘
pidstat -d 1 5

# 端口被谁占用
ss -lntp | grep ':8080'

# 统计接口的 p99 耗时(从访问日志里抽)
awk '{print $NF}' access.log | sort -n | awk '{a[NR]=$1} END{print a[int(NR*0.99)]}'

# 实时跟踪某进程打开的文件
strace -f -e trace=openat,read,write -p 1234 2>&1 | grep -v ENOENT

# 定时采样,落到文件里便于回溯
pidstat -u -r -d -p 1234 5 60 > /tmp/perf.log

4. 常见追问

Q:CPU 被打满,你怎么定位到具体代码行? 先 top -H 找线程 → perf top -p <pid> 或 perf record -g + 火焰图看热点函数 → Java 用 jstack 比对线程栈,Go 用 pprof。定位到函数后再看是死循环、锁竞争还是 GC。

Q:磁盘明明删了文件,df 还是满的? 进程还持有已删除文件的句柄。lsof +L1 或 ls -l /proc/<pid>/fd | grep deleted 找到后重启进程, 或者 : > /proc/<pid>/fd/<n> 直接截断。

Q:Load 高但 CPU 不高,看什么? ps -eo state,pid,wchan,comm | grep '^D' 找 D 状态任务,再看 iostat -x 的 await 与 %util, 常见原因是磁盘慢、NFS 超时、驱动卡住。

Q:ss 和 netstat 有什么区别? ss 直接从内核 netlink 读 socket 表,比遍历 /proc/net/tcp 的 netstat 快得多, 在几万连接时差别非常明显;netstat 已被 iproute2 弃用。

小结

命令要按"看什么资源、读什么文件、哪个字段有用"来记:CPU 看 us/sy/wa/st,内存看 MemAvailable, 磁盘看 %util/await,网络看 ss -s 与 ESTAB 数量,延迟看 p99 而不是平均值。 一套固定的排障顺序(水位 → 进程 → 线程 → 系统调用 → 网络抓包)比零散的命令清单更有说服力。

笔记加载中…