脚本中Lsof文件打开查看技巧

wen 实用脚本 8

本文目录导读:

脚本中Lsof文件打开查看技巧

  1. 核心参数组合
  2. 脚本中常用过滤技巧
  3. 高级过滤场景
  4. 性能优化技巧
  5. 常见脚本模式
  6. 安全注意事项
  7. 封装成函数复用
  8. 调试与日志

在脚本中使用 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

最佳实践总结:

  1. 优先使用 -t:只输出PID,适合脚本判断
  2. 结合 lsof +D 小心使用:避免全盘扫描
  3. 使用 -F 格式:处理大量输出时效率更高
  4. 注意权限:部分进程需要root才能查看
  5. 善用 grepawk:过滤特定类型文件

掌握这些技巧后,你可以高效地在脚本中处理文件打开状态监控、端口冲突检测、进程资源审计等常见运维场景。

抱歉,评论功能暂时关闭!