Tytuł mówi wszystko - jestem na Mac OS X i chcę wykryć, który program tworzy to irytujące awefawef2log plik w moim katalogu domowym co kilka godzin.
fs_usage jest lepszym narzędziem niż DTrace. fs_usage -w -f pathname | grep awefawef2log
Tytuł mówi wszystko - jestem na Mac OS X i chcę wykryć, który program tworzy to irytujące awefawef2log plik w moim katalogu domowym co kilka godzin.
fs_usage jest lepszym narzędziem niż DTrace. fs_usage -w -f pathname | grep awefawef2log
Odpowiedzi:
Trudno jest odpowiedzieć na dokładne pytanie, ponieważ próba utworzenia pliku, który już istnieje, nie musi być błędem. Powiedziawszy to, myślę, że możesz rozwiązać swój bezpośredni problem
bash-3.2# cat who.d
#include <fcntl.h>
syscall::open:entry
/arg1 & O_CREAT/
{
/* arg0 might not be paged-in yet */
self->pathp = arg0;
}
syscall::open:return
/self->pathp && basename(copyinstr(self->pathp)) == $$1/
{
printf("%s opened %s\n", execname, copyinstr(self->pathp));
/* free the thread-local storage */
self->pathp = NULL;
}
bash-3.2# dtrace -Cqs who.d testFile
touch opened testFile
^C
bash-3.2#
Bez wątpienia są pewne przypadki, w których nie będzie to możliwe, np. plik, który został otwarty, a następnie zmieniono jego nazwę.
Jeśli ważne jest znalezienie tylko pierwszego open() następnie możesz poeksperymentować z dostawcą fbt, aby wyszukać wywołanie funkcji obecne tylko wtedy, gdy plik docelowy jeszcze nie istnieje. Zazwyczaj byłby to przydział inode (ale nie vnode). Jednak myślę, że ciężko byłoby napisać coś solidnego i oczywiście nie byłoby stabilne w odniesieniu do zmian w systemie operacyjnym.
Po pierwsze możesz sprawdzić, czy plik jest otwierany przez jakąś aplikację
$ lsof | grep awefawef2log