Существуют и другие способы регистрации всех команд, выполненных пользователем. С установленным sysdig
можно запустить что-то вроде
# sysdig "user.name = jdoe and evt.type = execve"
для регистрации всех execve(2)
вызовов по jdoe
; опция -p
для sysdig
позволяет настроить формат вывода и т. д.
Другим способом было бы использование SystemTap
, преимущество которого заключается в том, что он поддерживается RedHat; здесь мы предполагаем, что jdoe
имеет UID 1000
;
probe begin {
printf("begin trace...\n\n")
}
probe syscall.execve.return {
if (uid() != 1000) next;
printf("runs %s[%d]: %s\n", execname(), pid(), cmdline_str());
}
затем это можно запустить с помощью чего-то вроде
# stap-prep
...
# stap whatyousavedtheaboveas.stp
Оба метода, скорее всего, потребуют корректировок, чтобы получить именно то, что вам нужно, обработать условия ошибок, когда execve
не работает, и т. д. С другой стороны, sysdig
и SystemTap
намного эффективнее, чемstrace
(run vmstat 1
и посмотрите, как strace
выталкивает контекстные переключатели через крышу во время работы ).
Если ваше дерево каталогов относительно статично (, то есть файлы и каталоги создаются или удаляются нечасто ), а не find
, вы можете попробовать использовать locate
.
locate(1) General Commands Manual locate(1)
NAME
locate - find files by name
SYNOPSIS
locate [OPTION]... PATTERN...
DESCRIPTION
locate reads one or more databases prepared by updatedb(8)
and writes file names matching at least one of the
PATTERNs to standard output, one per line.
If --regex is not specified, PATTERNs can contain globbing characters.
If any PATTERN contains no globbing characters,
locate behaves as if the pattern were *PATTERN*.
By default, locate does not check whether files found in database
still exist (but it does require all parent directories to exist
if the database was built with --require-visibility no).
locate can never report files created after the most recent
update of the relevant database.
…
Кэш файловой системы ядра делает вторую команду find
такой быстрой. Насколько я могу судить, нет возможности сбросить и восстановить кеш файловой системы. Если бы это было так, я ожидаю, что будет медленнее сначала записать кеш на диск, а затем перечитать его, чем заново запускать команду find
.