Intereting Posts
Ли Dropbear заботиться о hosts.allow и hosts.deny? Как узнать идентификатор процесса родительского процесса? текстовый файл в telnet через ssh Странная последовательность управления перед запросом пароля Установка квалификаторов для массива Bash Файлы отображаются в другом часовом поясе после передачи на другой компьютер (хотя оба компьютера имеют одинаковый часовой пояс) Просмотр параметров пути при использовании readline? Удалите файлы в каталоге, которые соответствуют регулярному выражению, используя терминал Mac Где хранятся записи в каталоге файлов для подкаталогов? Запустить команду при запуске GUI Выход XXD без разрывов строк изменить порт smtps в Postfix Использование sed для замены кода javascript в нескольких файлах Автоматическое разблокирование разделов LVM с помощью ключа LUKS dm-crypt Использование регулярного выражения для проверки того, работает ли процесс UNIX

Мониторинг активности файловой системы

Скажем, у меня есть программа, и я хочу отслеживать ее активность в файловой системе (какие файлы / каталоги создаются / модифицируются / удаляются и т. Д.). Эта программа может быть способна порождать дальнейшие процессы, и, таким образом, я хотел бы получить активность эти порождаемые процессы тоже.

Как мне это сделать?

Вы можете использовать strace для этого:

 strace -f -e trace=file command args... 

strace отслеживает системные вызовы и выводит описание их стандартной ошибки по мере их возникновения. Опция -f указывает, что она также отслеживает дочерние процессы и потоки. -e позволяет вам изменять вызовы, которые он будет отслеживать: -e trace=file будет регистрировать каждое использование open , unlink и т. д., но без действий без файла.

Если вы хотите увидеть, что было прочитано и записано в файлы, измените его на -e trace=file,read,write вместо этого; вы также можете просмотреть любые дополнительные вызовы, которые вы хотите изучить там. Если вы оставите этот аргумент полностью, вы получите каждый системный вызов.

Результат такой же (я запустил mkdir /tmp/test в трассированной оболочке):

 [pid 1444] execve("/usr/bin/mkdir", ["mkdir", "/tmp/test4"], [/* 33 vars */]) = 0 [pid 1444] access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) [pid 1444] open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 [pid 1444] open("/usr/lib/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 [pid 1444] open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3 [pid 1444] mkdir("/tmp/test", 0777) = 0 [pid 1444] +++ exited with 0 +++ --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=1444, si_status=0, si_utime=0, si_stime=0} --- 

Вы можете подключиться к файлу вместо терминала с -o filename и сделать вывод (даже) более подробным с -v. Также можно прикрепить к уже существующему процессу с -p PID , если это более полезно.

Если вы хотите сделать это программно, а не проверять себя, посмотрите на вызов ptrace , на котором строится strace .