Использование lsof для отслеживания файлов, открытых скриптом, который запускается через командную строку

Я знаю, что могу использовать lsof для отслеживания файлов, открытых запущенными процессами, группами процессов, пользователями и файлами, открытыми в определенных каталогах, среди прочего. Однако мне любопытно посмотреть, смогу ли я перехватывать файлы, которые были открыты программой, которая не всегда запущена, а работает только в течение ограниченного периода времени, такой как сценарий bash или программа Ruby.

Например, представьте, что я могу запустить свои тесты Ruby, выполнив rspec в моем каталоге Rails. Как я могу получить список ВСЕХ файлов, открытых rspec?

Другими словами, как заставить lsof перехватывать открытые файлы из процесса в режиме реального времени? Визуально это выглядит как lsof rspec, где lsof выполняет rspec и записывает все открытые файлы.


person n_x_l    schedule 23.06.2018    source источник


Ответы (1)


Я думаю, вы ищете программу strace, которая может отслеживать и регистрировать системные вызовы. Например, я могу запросить список файлов, открытых командой grep, следующим образом:

strace -e trace=open,openat grep something M* > /dev/null

Опция -e trace=open,openat сообщает strace, что нас интересуют только эти два системных вызова.

Я перенаправил вывод grep в /dev/null сюда, чтобы не загромождать вывод; вы также можете отправить вывод strace в файл, используя опцию -o.

Предполагая, что у меня есть файлы MANIFEST.in, MODULE_GUIDELINES.md и Makefile в моем локальном каталоге, это может привести к выводу, например:

openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3      
openat(AT_FDCWD, "/lib64/libpcre.so.1", O_RDONLY|O_CLOEXEC) = 3   
openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3      
openat(AT_FDCWD, "/lib64/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3    
open("/usr/lib64/gconv/gconv-modules.cache", O_RDONLY) = 3        
openat(AT_FDCWD, "Makefile", O_RDONLY|O_NOCTTY) = 3               
openat(AT_FDCWD, "MANIFEST.in", O_RDONLY|O_NOCTTY) = 3            
openat(AT_FDCWD, "MODULE_GUIDELINES.md", O_RDONLY|O_NOCTTY) = 3   
+++ exited with 0 +++

Здесь вы можете увидеть как общие библиотеки, открытые при запуске grep, так и файлы, открытые самим grep.

Вы можете прочитать больше на справочной странице strace.

person larsks    schedule 23.06.2018
comment
Конечно. Я использую Mac OS X, поэтому мне придется попробовать DTrace. Спасибо за Ваш ответ. - person n_x_l; 24.06.2018