跳到主要内容

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同上(更快)
curlHTTP 请求
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

相关链接