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
秒。此函数不轮询文件系统,而是使用特定于平台的功能从操作系统接收通知(例如,在 Linux 上通过 inotify)。有关详细信息,请参见下面链接的 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
秒。此函数不轮询文件系统,而是使用特定于平台的功能从操作系统接收通知(例如,在 Linux 上通过 inotify)。有关详细信息,请参阅下面链接的 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
一个用于创建建议性 pid 文件(锁文件)的简单实用工具。
Primary Functions
FileWatching.Pidfile.mkpidlock
— Functionmkpidlock([f::Function], at::String, [pid::Cint]; kwopts...)
mkpidlock(at::String, proc::Process; kwopts...)
为当前进程或由 pid 或 proc 标识的进程创建路径 "at" 的 pidfile 锁。可以传入一个函数,在锁定后执行,适用于 do
块,之后锁将自动关闭。如果锁定失败且 wait
为 false,则会抛出错误。
锁将通过 close
、finalizer
或在 proc
退出后不久释放。确保返回值在程序的关键部分结束之前保持有效,以便 finalizer
不会过早回收它。
可选关键字参数:
mode
: 文件访问模式(由进程 umask 修改)。默认为全局可读。poll_interval
: 指定尝试之间的最大时间(如果watch_file
无效)stale_age
: 如果现有的 pidfile 的 mtime 超过此秒数,则删除该文件(忽略锁)。如果文件中的 pid 似乎有效,则文件不会在超过此时间的 5 倍后被删除。如果refresh
被重写为 0 以禁用锁刷新,则为 25 倍。默认情况下此功能是禁用的(stale_age
= 0),但典型的推荐值大约是估计正常完成时间的 3-5 倍。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 是否是一个有效的进程 ID。
Base.Filesystem.touch
— Method