Изменения в файлах
#
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, proc::Process]; kwopts...)
Create a pidfile lock for the path "at" for the current process or the process identified by pid or proc. Can take a function to execute once locked, for usage in do
blocks, after which the lock will be automatically closed. If the lock fails and wait
is false, then an error is thrown.
The lock will be released by either close
, a finalizer
, or shortly after proc
exits. Make sure the return value is live through the end of the critical section of your program, so the finalizer
does not reclaim it early.
Optional keyword arguments:
-
mode
: file access mode (modified by the process umask). Defaults to world-readable. -
poll_interval
: Specify the maximum time to between attempts (ifwatch_file
doesn’t work) -
stale_age
: Delete an existing pidfile (ignoring the lock) if its mtime is older than this. The file won’t be deleted until 25x longer than this if the pid in the file appears that it may be valid. By default this is disabled (stale_age
= 0), but a typical recommended value would be about 3-5x an estimated normal completion time. -
refresh
: Keeps a lock from becoming stale by updating the mtime every interval of time that passes. By default, this is set tostale_age/2
, which is the recommended value. -
wait
: If true, block until we get the lock, if false, raise error if lock fails.
Вспомогательные функции
#
FileWatching.Pidfile.open_exclusive
— Function
open_exclusive(path::String; mode, poll_interval, stale_age) :: 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)
Write our pidfile format to an open IO descriptor.
#
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) :: 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.
#
Base.Filesystem.touch
— Method
Base.touch(::Pidfile.LockMonitor)
Обновляет mtime
для блокировки, чтобы указать ее актуальное состояние.
См. также описание ключевого слова refresh
в конструкторе mkpidlock
.