文件事件

FileWatching.poll_fd函数
poll_fd(fd, timeout_s::Real=-1; readable=false, writable=false)

监控文件描述符 fd 的读写可用性变化,并设置超时时间为 timeout_s 秒。

关键字参数确定要监控读或写状态中的哪一个;至少必须将其中一个设置为 true

返回值是一个对象,包含布尔字段 readablewritabletimedout,表示轮询结果。

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 状态对象可能为 StatStructEOFError(表示超时)或其他 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 文档。

返回值是一个对象,包含布尔字段 renamedchangedtimedout,表示监视文件的结果。

此函数的行为在不同平台上略有不同。有关更详细信息,请参阅 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

返回值是一个对,其中第一个字段是更改文件的名称(如果可用),第二个字段是一个对象,包含布尔字段 renamedchangedtimedout,表示事件。

此函数的行为在不同平台上略有不同。有关更详细信息,请参阅 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,则会抛出错误。

锁将由 closefinalizerproc 退出后不久释放。确保返回值在程序的关键部分结束前保持有效,以便 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

此函数需要 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

创建一个新的文件以进行读写建议性独占访问。如果 waitfalse,则如果锁文件存在则出错,否则阻塞直到获得锁。

有关关键字参数的说明,请参阅 mkpidlock

FileWatching.Pidfile.tryopen_exclusive函数
tryopen_exclusive(path::String, mode::Integer = 0o444) :: Union{Void, File}

尝试为读写建议性独占访问创建一个新文件,如果它已存在则返回空。

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 文件是否已过期。

Base.Filesystem.touch方法
Base.touch(::Pidfile.LockMonitor)

更新锁的 mtime,以表明它仍然是新鲜的。

另请参阅 mkpidlock 构造函数中的 refresh 关键字。