File Events
FileWatching.poll_fd
— Functionpoll_fd(fd, timeout_s::Real=-1; readable=false, writable=false)
Мониторинг файлового дескриптора fd
на изменения в доступности для чтения или записи, с тайм-аутом, заданным в секундах timeout_s
.
Ключевые аргументы определяют, какой из статусов чтения и/или записи должен быть отслежен; по крайней мере один из них должен быть установлен в true
.
Возвращаемое значение — это объект с булевыми полями readable
, writable
и timedout
, дающими результат опроса.
FileWatching.poll_file
— Functionpoll_file(path::AbstractString, interval_s::Real=5.007, timeout_s::Real=-1) -> (previous::StatStruct, current)
Мониторинг файла на изменения путем опроса каждые interval_s
секунд до тех пор, пока не произойдет изменение или не истечет timeout_s
секунд. interval_s
должен быть длительным периодом; по умолчанию это 5.007 секунд.
Возвращает пару объектов состояния (previous, current)
, когда обнаруживается изменение. Статус previous
всегда является StatStruct
, но он может иметь все поля, обнуленные (что указывает на то, что файл ранее не существовал или не был доступен).
Объект статуса current
может быть StatStruct
, EOFError
(что указывает на истечение времени ожидания) или другим подтипом Exception
(если операция stat
не удалась - например, если путь не существует).
Чтобы определить, когда файл был изменен, сравните current isa StatStruct && mtime(prev) != mtime(current)
, чтобы обнаружить уведомление об изменениях. Однако для этой операции предпочтительнее использовать watch_file
, так как это более надежно и эффективно, хотя в некоторых ситуациях это может быть недоступно.
FileWatching.watch_file
— Functionwatch_file(path::AbstractString, timeout_s::Real=-1)
Следите за файлом или директорией path
на предмет изменений до тех пор, пока не произойдет изменение или не истечет timeout_s
секунд. Эта функция не опрашивает файловую систему, а использует функциональность, специфичную для платформы, чтобы получать уведомления от операционной системы (например, через inotify на Linux). См. документацию NodeJS, приведенную ниже, для получения подробной информации.
Возвращаемое значение — это объект с булевыми полями renamed
, changed
и timedout
, которые дают результат наблюдения за файлом.
Это поведение функции немного варьируется в зависимости от платформы. См. https://nodejs.org/api/fs.html#fs_caveats для получения более подробной информации.
FileWatching.watch_folder
— Functionwatch_folder(path::AbstractString, timeout_s::Real=-1)
Следит за файлом или директорией path
на предмет изменений до тех пор, пока не произойдет изменение или не истечет timeout_s
секунд. Эта функция не опрашивает файловую систему, а использует функциональность, специфичную для платформы, чтобы получать уведомления от операционной системы (например, через inotify на Linux). См. документацию NodeJS, связанную ниже, для получения подробной информации.
Это будет продолжать отслеживать изменения для path
в фоновом режиме, пока не будет вызвана unwatch_folder
для того же path
.
Возвращаемое значение - это пара, где первое поле - это имя измененного файла (если доступно), а второе поле - это объект с булевыми полями renamed
, changed
и timedout
, указывающими на событие.
Это поведение этой функции немного варьируется в зависимости от платформ. См. https://nodejs.org/api/fs.html#fs_caveats для получения более подробной информации.
FileWatching.unwatch_folder
— Functionunwatch_folder(path::AbstractString)
Остановить фоновое отслеживание изменений для path
. Не рекомендуется делать это, пока другая задача ожидает, что watch_folder
вернется по тому же пути, так как результат может быть непредсказуемым.
Pidfile
Простой утилитный инструмент для создания advisory pidfiles (файлов блокировки).
Primary Functions
FileWatching.Pidfile.mkpidlock
— Functionmkpidlock([f::Function], at::String, [pid::Cint]; kwopts...)
mkpidlock(at::String, proc::Process; kwopts...)
Создайте блокировку pidfile для пути "at" для текущего процесса или процесса, идентифицируемого pid или proc. Можно передать функцию для выполнения после блокировки, для использования в блоках do
, после чего блокировка будет автоматически закрыта. Если блокировка не удалась и wait
равно false, то будет выброшена ошибка.
Блокировка будет освобождена либо с помощью close
, либо с помощью finalizer
, либо вскоре после выхода proc
. Убедитесь, что возвращаемое значение остается активным до конца критической секции вашей программы, чтобы finalizer
не освободил его слишком рано.
Необязательные аргументы ключевых слов:
mode
: режим доступа к файлу (изменяется маской процесса). По умолчанию доступен для чтения всем.poll_interval
: Укажите максимальное время между попытками (еслиwatch_file
не работает)stale_age
: Удалить существующий pidfile (игнорируя блокировку), если он старше этого количества секунд, основываясь на его mtime. Файл не будет удален, пока не пройдет 5x больше времени, чем это, если pid в файле кажется действительным. Или 25x больше, еслиrefresh
переопределен на 0, чтобы отключить обновление блокировки. По умолчанию это отключено (stale_age
= 0), но типичное рекомендуемое значение составляет около 3-5x оценочного нормального времени завершения.refresh
: Предотвращает устаревание блокировки, обновляя mtime через каждый интервал времени. По умолчанию это установлено наstale_age/2
, что является рекомендуемым значением.wait
: Если true, блокировать до получения блокировки, если false, выбросить ошибку, если блокировка не удалась.
FileWatching.Pidfile.trymkpidlock
— Functiontrymkpidlock([f::Function], at::String, [pid::Cint]; kwopts...)
trymkpidlock(at::String, proc::Process; kwopts...)
Как и mkpidlock
, но возвращает false
, если файл уже заблокирован, вместо ожидания.
Эта функция требует как минимум Julia 1.10.
Base.close
— Methodclose(lock::LockMonitor)
Освободите блокировку pidfile.
Helper Functions
FileWatching.Pidfile.open_exclusive
— Functionopen_exclusive(path::String; mode, poll_interval, wait, stale_age, refresh) :: File
Создайте новый файл для чтения-записи с эксклюзивным доступом по совету. Если wait
равно false
, то выдать ошибку, если файлы блокировки существуют, в противном случае заблокироваться до получения блокировки.
Для описания аргументов ключевых слов смотрите mkpidlock
.
FileWatching.Pidfile.tryopen_exclusive
— Functiontryopen_exclusive(path::String, mode::Integer = 0o444) :: Union{Void, File}
Попробуйте создать новый файл для доступа с эксклюзивным чтением-записью, ничего не возвращайте, если он уже существует.
FileWatching.Pidfile.write_pidfile
— Functionwrite_pidfile(io, pid)
Запишите наш формат pidfile в открытый дескриптор IO.
FileWatching.Pidfile.parse_pidfile
— Functionparse_pidfile(file::Union{IO, String}) => (pid, hostname, age)
Попытка разобрать наш формат pidfile, заменив элемент на (0, "", 0.0) соответственно для любого неудачного чтения.
FileWatching.Pidfile.stale_pidfile
— Functionstale_pidfile(path::String, stale_age::Real, refresh::Real) :: Bool
Вспомогательная функция для open_exclusive
, которая определяет, является ли pidfile устаревшим.
FileWatching.Pidfile.isvalidpid
— Functionisvalidpid(hostname::String, pid::Cuint) :: Bool
Попытка осторожно оценить, является ли pid допустимым идентификатором процесса.
Base.Filesystem.touch
— MethodBase.touch(::Pidfile.LockMonitor)
Обновите mtime
на блокировке, чтобы указать, что она все еще актуальна.
Смотрите также ключевое слово refresh
в конструкторе mkpidlock
.