В комплекте 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);
}