在 Debian(以及其他 Linux 系统)上监控 readdir 调用,常见做法有以下几种,按“侵入性 / 精度 / 易用性”从低到高说明:
strace 监控(推荐)strace -e trace=readdir -p <PID>
或启动时监控:
strace -e trace=readdir ls /
⚠️ 注意:
- glibc 中很多程序实际调用的是
getdents64/getdents,而不是readdirreaddir是 libc 封装,系统调用层通常看不到
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 做低开销监控(生产环境推荐)readdir 相关调用perf trace -e getdents,getdents64
或跟踪某一进程:
perf trace -p <PID> -e getdents64
perf record -e syscalls:sys_enter_getdents64 -g
perf report
bpftracebpftrace -e '
tracepoint:syscalls:sys_enter_getdents64 {
printf("%s %d %s\n", comm, pid, str(args->pathname));
}
'
/usr/share/bcc/tools/opensnoop
/usr/share/bcc/tools/execsnoop
或自定义:
/usr/share/bcc/tools/trace 'syscalls:sys_enter_getdents64'
✅ 优点:
❌ 要求:
bpfcc-tools / bpftrace如果你关心的是“哪些目录被读取”:
inotifywait -m -r /path
⚠️ inotify 不能直接捕获 readdir
auditctl -w /etc -p r -k readdir_monitor
ausearch -k readdir_monitor
| 需求 | 推荐方案 |
|---|---|
| 快速看调用 | strace -e getdents64 |
| 看 libc 函数 | ltrace -e readdir |
| 生产环境 | perf / eBPF |
| 精确目录访问 | audit |
如果你能告诉我:
我可以给你更精确的命令示例。