В комплекте dtrace tool kit есть скрипт opensnoop, который позволяет просматривать открытые файлы в режиме реального времени.
Пример использования.
./opensnoop.d -x -n php UID PID COMM FD PATH 620 8483 php -1 /var/ld/ld.config 620 8483 php -1 /bin//php-cli.ini 620 8483 php -1 /soft/sun_free/php/php-cli.ini 620 8483 php -1 /bin//php.ini ...
FD – файл дескриптор (-1 значит ошибка, что файл не существует)
Хочу так же представить полезные скрипты написанные Julien Gabel (автор ресурса http://blog.thilelli.net/)
– readfile.d (показывает полный путь к открытым файлам (read) заданного приложения и количество обращений)
Пример использования.
# readfile.d php 5s
Исходник.
#!/usr/sbin/dtrace -s #pragma D option quiet dtrace:::BEGIN { printf("%s %s %s", "Sampling for", $$2, "... Please wait."); } syscall::*read:entry /execname == $$1/ { self->thr = 1; self->fd = arg0; } syscall::*read:return /self->thr/ { /* * About resolving the file name (self->vpath): * Shamefully stolen from the `rwsnoop' dtrace script (found * in the DTraceToolkit), by Brendan Gregg. Please refer to * http://www.brendangregg.com/dtrace.html for more information * on DTrace tools and good examples. */ this->filistp = curthread->t_procp->p_user.u_finfo.fi_list; this->ufentryp = (uf_entry_t *)((uint64_t)this->filistp + (uint64_t)self->fd * (uint64_t)sizeof(uf_entry_t)); this->filep = this->ufentryp->uf_file; this->vnodep = this->filep != 0 ? this->filep->f_vnode : 0; self->vpath = this->vnodep ? (this->vnodep->v_path != 0 ? cleanpath(this->vnodep->v_path) : "") : ""; @rnum[self->vpath] = count(); self->thr = 0; self->fd = 0; self->vpath = 0; } profile:::tick-$2 { printf("%-80s %7s", "FILE NAME", "COUNT"); printa("%-80s %@7d", @rnum); exit(0); }
– readid.d (показывает pid, приложение, количество обращений read)
Пример использования.
# ./readid.d php 5s
Исходник.
#!/usr/sbin/dtrace -s #pragma D option quiet dtrace:::BEGIN { printf("%s %s %s", "Sampling for", $$2, "... Please wait."); } syscall::*read:entry /execname == $$1/ { self->thr = 1; } syscall::*read:return /self->thr/ { @ridnum[execname,pid] = count(); self->thr = 0; } profile:::tick-$2 { printf("%-15s %10s %10s", "PROGRAM", "PID", "COUNT"); printa("%-15s %10d %@10d", @ridnum); exit(0); }