time
это блестящая команда, если вы хотите выяснить, сколько процессорного времени занимает данная команда.
Я ищу что-то подобное, что может перечислить файлы, к которым обращается программа и ее дочерние элементы. Либо в режиме реального времени, либо в виде отчета.
В настоящее время я использую:
#!/bin/bash
strace -ff -e trace=file "$@" 2>&1 | perl -ne 's/^[^"]+"(([^\\"]|\\[\\"nt])*)".*/$1/ && print'
но он терпит неудачу, если команда для запуска включает sudo
. Он не очень интеллектуален (было бы хорошо, если бы он мог только перечислять файлы, существующие или у которых были проблемы с правами доступа, или группировать их в файлы, которые читаются, и файлы, которые записываются). Также strace
медленно, поэтому было бы хорошо с более быстрым выбором.
files
monitoring
strace
Оле Танге
источник
источник
strace
, я предполагаю, что вы особенно заинтересованы в Linux. Верный?Ответы:
Я сдался и закодировал свой собственный инструмент. Цитировать из его документов:
Он выводит только файлы, поэтому вам не нужно иметь дело с выводом из
strace
.https://gitlab.com/ole.tange/tangetools/tree/master/tracefile
источник
make && sudo make install
. Тогда вы можете бежатьman tracefile
.yum -y install https://extras.getpagespeed.com/release-el7-latest.rpm
аyum -y install tracefile
Вы можете отследить системные вызовы
strace
, но это действительно неизбежное снижение скорости. Вам нужно запускатьstrace
с правами root, если команда запускается с повышенными привилегиями:Другой метод , который, вероятно, будет быстрее , предварительно загрузить библиотеку , которая обтекает функции доступа к файловой системе:
LD_PRELOAD=/path/to/libmywrapper.so mycommand
.LD_PRELOAD
Переменная окружения не будет передана программ , вызываемых с повышенными привилегиями. Вам нужно написать код этой библиотеки-обёртки ( вот пример из «Построения библиотечных вставок для развлечения и выгоды» ); Я не знаю, есть ли в сети доступный для повторного использования код.Если вы отслеживаете файлы в определенной иерархии каталогов, вы можете просмотреть файловую систему с помощью LoggedFS так , чтобы все обращения через это представление регистрировались.
Чтобы настроить LoggedFS, начните с примера конфигурации, поставляемой с программой, и прочитайте синтаксис файла конфигурации LoggedFS .
Другой возможностью является подсистема аудита Linux . Убедитесь, что
auditd
демон запущен, затем настройте то, с чем вы хотите войтиauditctl
. Каждая регистрируемая операция записывается в/var/log/audit/audit.log
(в типичных дистрибутивах). Чтобы начать просмотр определенного файла:Если вы помещаете наблюдение в каталог, рекурсивно также просматриваются файлы в нем и его подкаталогах. Старайтесь не смотреть каталог, содержащий журналы аудита. Вы можете ограничить ведение журнала определенными процессами, см.
auditctl
Справочную страницу для доступных фильтров. Вы должны быть пользователем root, чтобы использовать систему аудита.источник
LD_PRELOAD
также не будет работать на статических двоичных файлах.Я думаю, что вы хотите lsof (возможно, по каналу программы, и это дети). Он сообщит вам каждый файл, к которому в данный момент обращаются в файловой системе. Для получения информации о том, какие файлы доступны процессу ( отсюда ):
источник
Я попробовал это
tracefile
. Для меня это дало гораздо меньше совпадений, чем моеstrace ... | sed ... | sort -u
. Я даже добавил-s256
вstrace(1)
командную строку, но это не сильно помогло ...Тогда я попробовал это
loggedfs
. Сначала это не удалось, так как у меня не было доступа для чтения / записи к каталогу, в который я пытался войти. После временного выполнения команды chmod 755 я получил несколько хитов ...Но, мне кажется, лучше всего сделать следующее:
inotifywait -m -r -e OPEN /path/to/traced/directory
А затем постобработать вывод после запуска интересующего процесса.
Это не перехватывает доступ к процессам доступа к файлам отслеживаемого каталога, и при этом он не знает, получил ли какой-либо другой процесс доступ к тому же дереву каталогов, но во многих случаях это достаточно хороший инструмент для выполнения работы.
РЕДАКТИРОВАТЬ: inotifywait не перехватывает доступ к символическим ссылкам (только цели после разрешения символических ссылок). Это меня поразило, когда я заархивировал библиотеки, к которым обращалась программа для будущего использования. Использовал некоторые дополнительные хакеры perl glob, чтобы выбрать символические ссылки вдоль уведомленных библиотек, чтобы выполнить работу в этом конкретном случае.
EDIT2: по крайней мере, когда inotifying файлы и сами символические ссылки из вывода командной строки inotifywait (например,
inotifywait -m file symlink
orinotifywait symlink file
) покажет доступ к тому, кто находится первым в командной строке (независимо от того, к какомуfile
изsymlink
них обращаются). inotifywait не поддерживает IN_DONT_FOLLOW - который, когда я пытался программно, просто позволяет увидеть доступfile
(который может или не может быть тем, что вы ожидаете ...) независимо от порядка в командной строкеисточник
tracefile
отсутствия доступа к файлу?Хотя это может не дать вам достаточного контроля (пока?), Я написал программу, которая хотя бы частично удовлетворяет ваши потребности, используя fanotify и unshare ядра Linux для мониторинга только файлов, измененных (или прочитанных) определенным процессом и его дочерними элементами. , По сравнению с strace это довольно быстро (;
Его можно найти на https://github.com/tycho-kirchner/shournal
Пример на оболочке:
источник