温馨提示×

怎样监控debian readdir调用

小樊
54
2026-10-07 06:48:02
栏目: 智能运维

在 Debian(以及其他 Linux 系统)上监控 readdir 调用,常见做法有以下几种,按“侵入性 / 精度 / 易用性”从低到高说明:


一、最常用:用 strace 监控(推荐)

1. 监控某个进程

strace -e trace=readdir -p <PID>

或启动时监控:

strace -e trace=readdir ls /

⚠️ 注意:

  • glibc 中很多程序实际调用的是 getdents64 / getdents,而不是 readdir
  • readdir 是 libc 封装,系统调用层通常看不到

2. 更真实的方式(看系统调用)

strace -e trace=getdents,getdents64 -f -p <PID>

参数说明:

  • -f:跟踪子进程
  • -p:进程号
  • -e trace=:指定系统调用

二、用 ltrace 监控 libc 层 readdir

如果你一定要监控 readdir() 这个 libc 函数:

ltrace -e readdir -p <PID>

或:

ltrace -e readdir command

适合:

  • 调试程序逻辑
  • 确认是否真的调用了 readdir

缺点:

  • 性能开销较大
  • 对静态链接程序无效

三、用 perf 做低开销监控(生产环境推荐)

1. 跟踪 readdir 相关调用

perf trace -e getdents,getdents64

或跟踪某一进程:

perf trace -p <PID> -e getdents64

2. 查看调用栈

perf record -e syscalls:sys_enter_getdents64 -g
perf report

四、用 eBPF(最强大,内核级)

1. 使用 bpftrace

bpftrace -e '
tracepoint:syscalls:sys_enter_getdents64 {
    printf("%s %d %s\n", comm, pid, str(args->pathname));
}
'

2. 使用 BCC 工具

/usr/share/bcc/tools/opensnoop
/usr/share/bcc/tools/execsnoop

或自定义:

/usr/share/bcc/tools/trace 'syscalls:sys_enter_getdents64'

✅ 优点:

  • 极低性能影响
  • 可生产环境使用

❌ 要求:

  • 内核 ≥ 4.9
  • 安装 bpfcc-tools / bpftrace

五、文件系统层监控(不区分 readdir)

如果你关心的是“哪些目录被读取”:

inotify(有限)

inotifywait -m -r /path

⚠️ inotify 不能直接捕获 readdir

Audit(系统级)

auditctl -w /etc -p r -k readdir_monitor
ausearch -k readdir_monitor

六、快速选择建议

需求 推荐方案
快速看调用 strace -e getdents64
看 libc 函数 ltrace -e readdir
生产环境 perf / eBPF
精确目录访问 audit

如果你能告诉我:

  • 是 哪个程序
  • 想要 用户态还是内核态
  • 是否 生产环境

我可以给你更精确的命令示例。

0 踩