Изменения в файлах
#
FileWatching.poll_fd
— Function
poll_fd(fd, timeout_s::Real=-1; readable=false, writable=false)
Отслеживает изменение доступности файла с дескриптором fd
для чтения или записи с временем ожидания timeout_s
секунд.
Именованные аргументы определяют, какие состояния (чтение и (или) запись) следует отслеживать; по крайней мере один из них должен иметь значение true
.
Возвращается объект с логическими полями readable
, writable
и timedout
, представляющими результат опроса.
#
FileWatching.poll_file
— Function
poll_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
— Function
watch_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
— Function
watch_folder(path::AbstractString, timeout_s::Real=-1)
Отслеживает изменения в файле или каталоге path
, пока не произойдет изменение или не пройдет timeout_s
секунд. Эта функция не опрашивает файловую систему, а вместо этого использует возможности платформы для получения уведомлений от операционной системы (например, inotify в Linux). Подробные сведения см. в документации по NodeJS по приведенной ниже ссылке.
Отслеживание изменений по пути path
будет продолжаться в фоновом режиме, пока для того же пути path
не будет вызвана функция unwatch_folder
.
Возвращаемое значение представляет собой пару полей, первое из которых — это имя измененного файла (если доступно), а второе — это объект с логическими полями renamed
, changed
и timedout
, описывающими событие.
Поведение этой функции на разных платформах немного различается. Дополнительные сведения см. в разделе https://nodejs.org/api/fs.html#fs_caveats.
#
FileWatching.unwatch_folder
— Function
unwatch_folder(path::AbstractString)
Останавливает отслеживание изменений по пути path
в фоновом режиме. Это не рекомендуется делать, пока другая задача ожидает возврата управления функцией watch_folder
, выполняющейся для того же пути, так как результат может быть непредсказуемым.
Основные функции
#
FileWatching.Pidfile.mkpidlock
— Function
mkpidlock([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. Файл не будет удален, пока его возраст не превысит указанное значение, умноженное на 5, если pid в файле указывает, что он может быть действительным. Или умноженное на 25, еслиrefresh
переопределено значением 0 для отключения обновления блокировки. По умолчанию этот параметр отключен (stale_age
= 0), но типичное рекомендуемое значение будет примерно в 3—5 раз больше предполагаемого обычного времени завершения. -
refresh
: предотвращает устаревание блокировки путем обновления mtime через каждый прошедший интервал времени. По умолчанию установлено значениеstale_age/2
, которое является рекомендуемым. -
wait
: если задано значение true, блокировка действует до тех пор, пока не будет получена; если задано false, то при сбое блокировки выдается ошибка.
#
FileWatching.Pidfile.trymkpidlock
— Function
trymkpidlock([f::Function], at::String, [pid::Cint]; kwopts...)
trymkpidlock(at::String, proc::Process; kwopts...)
Аналогично mkpidlock
, за исключением того, что возвращает false
вместо ожидания, если файл уже заблокирован.
Совместимость: Julia 1.10
Для этой функции требуется версия Julia не ниже 1.10. |
Вспомогательные функции
#
FileWatching.Pidfile.open_exclusive
— Function
open_exclusive(path::String; mode, poll_interval, wait, stale_age, refresh) :: File
Create a new a file for read-write advisory-exclusive access. If wait
is false
then error out if the lock files exist otherwise block until we get the lock.
For a description of the keyword arguments, see mkpidlock
.
#
FileWatching.Pidfile.tryopen_exclusive
— Function
tryopen_exclusive(path::String, mode::Integer = 0o444) :: Union{Void, File}
Try to create a new file for read-write advisory-exclusive access, return nothing if it already exists.
#
FileWatching.Pidfile.write_pidfile
— Function
write_pidfile(io, pid)
Простое вспомогательное средство для создания справочных файлов pidfile (файлов блокировки).
#
FileWatching.Pidfile.parse_pidfile
— Function
parse_pidfile(file::Union{IO, String}) => (pid, hostname, age)
Attempt to parse our pidfile format, replaced an element with (0, "", 0.0), respectively, for any read that failed.
#
FileWatching.Pidfile.stale_pidfile
— Function
stale_pidfile(path::String, stale_age::Real, refresh::Real) :: Bool
Helper function for open_exclusive
for deciding if a pidfile is stale.
#
FileWatching.Pidfile.isvalidpid
— Function
isvalidpid(hostname::String, pid::Cuint) :: Bool
Attempt to conservatively estimate whether pid is a valid process id.