本文目录导读:

在脚本中使用 lsof 查看文件打开情况时,掌握以下技巧可以显著提升效率和准确性:
核心参数组合
# 查看特定进程打开的文件 lsof -p <PID> # 查看特定用户打开的文件 lsof -u <username> # 查看特定文件系统挂载点的打开文件 lsof /path/to/mount # 查看网络连接(关键) lsof -i lsof -i :80 # 特定端口 lsof -i tcp # TCP连接
脚本中常用过滤技巧
按文件描述符过滤
# 只显示普通文件(排除socket、pipe等) lsof -p <PID> | awk '$5 ~ /^REG|^DIR/' # 显示已删除但仍被占用文件 lsof -p <PID> | grep '(deleted)'
格式化输出(适合脚本处理)
lsof -F n -p <PID> # -F 输出机器可读格式
# 自定义格式(更可控)
lsof -p <PID> -o | awk 'NR>1 {print $1, $3, $7, $8, $9}'
高级过滤场景
查找占用特定端口的进程
# 方法1:直接
lsof -i :443 -P -n | awk 'NR>1{print $1, $3}'
# 方法2:排除已关闭的TIME_WAIT
lsof -i :443 -P -n | grep -v TIME_WAIT
# 方法3:完全脚本友好
lsof -t -i :443 # 只输出PID
监控文件操作
# 配合 watch 实时监控
watch -n 1 "lsof -p <PID> | wc -l"
# 监控特定文件被打开
while true; do
lsof /var/log/syslog
sleep 2
done
性能优化技巧
避免递归扫描
# 只查当前进程,不递归子进程 lsof -p <PID> -w # -w 禁用警告 # 限制结果数量 lsof -p <PID> | head -50 | tail -10 # 中间部分
批量处理多个进程
# 查找所有nginx进程的文件
lsof -c nginx # 按命令名匹配
# 或使用进程组
for pid in $(pgrep nginx); do
lsof -p $pid -F n >> /tmp/nginx_files.txt
done
常见脚本模式
检查文件是否被占用
# 脚本中安全使用
if lsof /path/to/file > /dev/null 2>&1; then
echo "文件被占用"
else
echo "文件可操作"
fi
# 精确检查某个PID
if lsof -p $PID 2>/dev/null | grep -q "/path/to/target"; then
echo "进程占用目标文件"
fi
检测端口冲突
PORT=8080
if lsof -i :$PORT -s TCP:LISTEN > /dev/null 2>&1; then
echo "端口 $PORT 已被占用"
PID=$(lsof -t -i :$PORT)
echo "占用进程PID: $PID"
fi
安全注意事项
# 避免输出过多信息
lsof +D / # 扫描整个根目录很危险,不推荐
# 限制目录深度
lsof /var/log -ad lib # 只查特定子目录
# 权限检查
if [ "$(id -u)" -ne 0 ]; then
echo "部分文件需root权限查看"
fi
封装成函数复用
# 获取进程打开文件数量
get_fd_count() {
lsof -p $1 2>/dev/null | wc -l || echo "0"
}
# 检查端口是否可用
check_port() {
local port=$1
if lsof -i :$port -s TCP:LISTEN -t > /dev/null 2>&1; then
return 1 # 端口被占用
fi
return 0 # 端口可用
}
调试与日志
# 记录到日志,便于分析 lsof -p $PID -F n >> /var/log/lsof_debug.log 2>&1 # 输出到CSV(方便Excel处理) lsof -p $PID -F n | tr '\n' ',' | sed 's/,$/\n/' >> output.csv
最佳实践总结:
- 优先使用
-t:只输出PID,适合脚本判断 - 结合
lsof +D小心使用:避免全盘扫描 - 使用
-F格式:处理大量输出时效率更高 - 注意权限:部分进程需要root才能查看
- 善用
grep和awk:过滤特定类型文件
掌握这些技巧后,你可以高效地在脚本中处理文件打开状态监控、端口冲突检测、进程资源审计等常见运维场景。