
strace、lsof 和 ps:Linux 进程与系统调试
了解 Linux 系统内部运行情况的基本工具。
ps - 进程快照
# 所有进程的详细信息
ps aux
# 进程树
ps auxf
# 查找特定进程
ps aux | grep nginx
# 按用户查看进程
ps -u www-data
# 自定义格式
ps -eo pid,ppid,user,%cpu,%mem,cmd --sort=-%mem | head -20
# 实时监控进程
watch -n1 'ps aux --sort=-%cpu | head -10'
top / htop
# 交互式 CPU/内存监控
top
# 更好的版本
htop
# 在 top 中按内存排序
top -o %MEM
# htop 快捷键
# F2: 设置, F3: 搜索, F4: 过滤
# F5: 树形视图, F6: 排序, F9: 终止
lsof - 列出打开的文件
# 所有打开的文件
lsof
# 按进程查看打开的文件
lsof -p 1234
# 按用户查看打开的文件
lsof -u www-data
# 网络连接
lsof -i
# TCP 连接
lsof -i TCP
# 特定端口
lsof -i :8080
# 目录中的文件
lsof +D /var/log/nginx
# 查找使用某个文件的进程
lsof /path/to/file
netstat / ss
# 所有监听端口
ss -tlnp
netstat -tlnp
# 所有连接
ss -anp
# 检查特定端口
ss -tlnp | grep ':80'
# 显示路由表
netstat -r
ip route show
strace - 系统调用跟踪器
# 跟踪进程系统调用
strace ls /tmp
# 跟踪正在运行的进程
strace -p 1234
# 仅显示文件相关调用
strace -e trace=file ls /tmp
# 仅显示网络调用
strace -e trace=network curl http://example.com
# 统计并汇总调用
strace -c ls /tmp
# 跟踪子进程
strace -f nginx
# 保存到文件
strace -o /tmp/trace.log myapp
实际调试场景
# 查找哪个进程在使用端口 3000
lsof -i :3000
# 或
fuser 3000/tcp
# 磁盘为什么满了?
lsof | grep deleted | awk '{print $7, $9}' | sort -rn | head
# 查找慢系统调用
strace -T -e trace=file myapp 2>&1 | awk '{print $NF, $0}' | sort -rn | head
# 内存泄漏调查
cat /proc/1234/status | grep -E "VmRSS|VmSize"
# 文件描述符限制
cat /proc/1234/limits | grep "open files"
ulimit -n
这些工具能让你深入了解系统行为,用于调试生产问题。