文件事件
FileWatching.poll_fd
— 函数poll_fd(fd, timeout_s::Real=-1; readable=false, writable=false)
监控文件描述符 fd
的读写可用性变化,并设置超时时间为 timeout_s
秒。
关键字参数确定要监控读或写状态中的哪一个;至少必须将其中一个设置为 true
。
返回值是一个对象,包含布尔字段 readable
、writable
和 timedout
,表示轮询结果。
FileWatching.poll_file
— 函数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
— 函数watch_file(path::AbstractString, timeout_s::Real=-1)
监视文件或目录 path
的更改,直到发生更改或经过 timeout_s
秒。此函数不轮询文件系统,而是使用特定于平台的功能从操作系统接收通知(例如,在 Linux 上通过 inotify)。有关详细信息,请参阅下面链接的 NodeJS 文档。
返回值是一个对象,包含布尔字段 renamed
、changed
和 timedout
,表示监视文件的结果。
此函数的行为在不同平台上略有不同。有关更详细信息,请参阅 https://node.org.cn/api/fs.html#fs_caveats。
FileWatching.watch_folder
— 函数watch_folder(path::AbstractString, timeout_s::Real=-1)
监视文件或目录 path
的更改,直到发生更改或经过 timeout_s
秒。此函数不轮询文件系统,而是使用特定于平台的功能从操作系统接收通知(例如,在 Linux 上通过 inotify)。有关详细信息,请参阅下面链接的 NodeJS 文档。
这将继续在后台跟踪 path
的更改,直到对同一 path
调用 unwatch_folder
。
返回值是一个对,其中第一个字段是更改文件的名称(如果可用),第二个字段是一个对象,包含布尔字段 renamed
、changed
和 timedout
,表示事件。
此函数的行为在不同平台上略有不同。有关更详细信息,请参阅 https://node.org.cn/api/fs.html#fs_caveats。
FileWatching.unwatch_folder
— 函数unwatch_folder(path::AbstractString)
停止对 path
的更改的后台跟踪。不建议在另一个任务等待 watch_folder
对同一路径返回时执行此操作,因为结果可能不可预测。
Pidfile
一个用于创建建议性 pidfile(锁文件)的简单实用程序工具。
主要函数
FileWatching.Pidfile.mkpidlock
— 函数mkpidlock([f::Function], at::String, [pid::Cint, 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
— 函数trymkpidlock([f::Function], at::String, [pid::Cint, proc::Process]; kwopts...)
类似于 mkpidlock
,但如果文件已锁定则返回 false
而不是等待。
此函数需要 Julia 1.10 或更高版本。
Base.close
— 方法close(lock::LockMonitor)
释放 pidfile 锁。
辅助函数
FileWatching.Pidfile.open_exclusive
— 函数open_exclusive(path::String; mode, poll_interval, wait, stale_age, refresh) :: File
创建一个新的文件以进行读写建议性独占访问。如果 wait
为 false
,则如果锁文件存在则出错,否则阻塞直到获得锁。
有关关键字参数的说明,请参阅 mkpidlock
。
FileWatching.Pidfile.tryopen_exclusive
— 函数tryopen_exclusive(path::String, mode::Integer = 0o444) :: Union{Void, File}
尝试为读写建议性独占访问创建一个新文件,如果它已存在则返回空。
FileWatching.Pidfile.write_pidfile
— 函数write_pidfile(io, pid)
将我们的 pidfile 格式写入打开的 IO 描述符。
FileWatching.Pidfile.parse_pidfile
— 函数parse_pidfile(file::Union{IO, String}) => (pid, hostname, age)
尝试解析我们的 pid 文件格式,对于任何读取失败的元素,分别用 (0, "", 0.0) 替换。
FileWatching.Pidfile.stale_pidfile
— 函数stale_pidfile(path::String, stale_age::Real, refresh::Real) :: Bool
open_exclusive
的辅助函数,用于判断 pid 文件是否已过期。
FileWatching.Pidfile.isvalidpid
— 函数isvalidpid(hostname::String, pid::Cuint) :: Bool
尝试保守地估计 pid 是否为有效的进程 ID。
Base.Filesystem.touch
— 方法