Linux 常用命令
问题
Java 后端开发需要掌握哪些 Linux 命令?如何排查线上问题?
答案
文件与目录操作
| 命令 | 说明 | 常用选项 |
|---|---|---|
ls | 列出文件 | -la(详细)、-lh(人类可读大小) |
cd | 切换目录 | cd -(回到上一个目录) |
cp | 复制 | -r(递归复制目录) |
mv | 移动/重命名 | |
rm | 删除 | -rf(强制递归删除) |
find | 查找文件 | find / -name "*.log" -mtime +7 |
chmod | 修改权限 | chmod 755 file |
chown | 修改所有者 | chown user:group file |
文本处理
| 命令 | 说明 | 示例 |
|---|---|---|
cat | 显示文件内容 | cat file.txt |
tail | 查看文件尾部 | tail -f app.log(实时跟踪) |
head | 查看文件头部 | head -n 100 file |
grep | 搜索文本 | grep -rn "Exception" logs/ |
awk | 文本处理 | awk '{print $1}' access.log |
sed | 流编辑器 | sed 's/old/new/g' file |
sort | 排序 | sort -t: -k3 -n |
uniq | 去重 | sort | uniq -c(统计重复次数) |
wc | 统计 | wc -l(行数) |
进程与系统监控
| 命令 | 说明 |
|---|---|
ps aux | 查看所有进程 |
top / htop | 实时进程监控 |
kill -9 <pid> | 强制终止进程 |
free -h | 查看内存使用 |
df -h | 查看磁盘使用 |
du -sh * | 查看目录大小 |
uptime | 系统运行时间和负载 |
vmstat 1 | 系统状态(CPU/内存/IO/上下文切换) |
iostat -x 1 | 磁盘 IO 统计 |
网络相关
| 命令 | 说明 |
|---|---|
netstat -tlnp | 查看监听端口 |
ss -tlnp | 同上(更快) |
curl | HTTP 请求 |
ping | 测试网络连通性 |
traceroute | 追踪路由 |
tcpdump | 抓包 |
lsof -i :8080 | 查看端口占用的进程 |
Java 线上排查常用组合
排查 CPU 飙高
# 1. 找到 CPU 最高的 Java 进程
top -c
# 2. 找到该进程中 CPU 最高的线程
top -Hp <pid>
# 3. 将线程 ID 转为十六进制
printf '%x\n' <tid>
# 4. 在线程堆栈中找到该线程
jstack <pid> | grep <hex_tid> -A 30
排查内存问题
# 查看 JVM 堆内存使用
jmap -heap <pid>
# 导出堆转储
jmap -dump:format=b,file=heap.hprof <pid>
# 查看 GC 情况
jstat -gcutil <pid> 1000
日志排查
# 实时查看日志
tail -f app.log
# 统计错误数量
grep -c "ERROR" app.log
# 搜索特定时间段的日志
awk '/2024-01-15 10:00/,/2024-01-15 11:00/' app.log
# 统计接口调用次数(按 URL 排序)
awk '{print $7}' access.log | sort | uniq -c | sort -rn | head -20
常见面试问题
Q1: 如何查看 Java 进程的线程数?
答案:
# 方式 1
ps -T -p <pid> | wc -l
# 方式 2
ls /proc/<pid>/task | wc -l
# 方式 3:Arthas
thread
Q2: 如何查找大文件?
答案:
# 查找大于 100MB 的文件
find / -type f -size +100M -exec ls -lh {} \;
# 查看目录大小并排序
du -sh /* | sort -rh | head -10
Q3: 如何快速定位日志中的异常?
答案:
# 查找最近的异常
grep -n "Exception\|Error" app.log | tail -20
# 查看异常前后 5 行上下文
grep -B5 -A5 "NullPointerException" app.log
# 统计各种异常出现次数
grep "Exception" app.log | awk -F: '{print $NF}' | sort | uniq -c | sort -rn