File Events

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

监视文件描述符 fd 的读或写可用性变化,超时时间由 timeout_s 秒给出。

关键字参数决定了应监视读和/或写状态;至少其中一个必须设置为 true

返回的值是一个具有布尔字段 readablewritabletimedout 的对象,给出轮询的结果。

source
FileWatching.poll_fileFunction
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 进行此操作更为优选,因为它更可靠且高效,尽管在某些情况下可能不可用。

source
FileWatching.watch_fileFunction
watch_file(path::AbstractString, timeout_s::Real=-1)

监视文件或目录 path 的更改,直到发生更改或经过 timeout_s 秒。此函数不轮询文件系统,而是使用特定于平台的功能从操作系统接收通知(例如,在 Linux 上通过 inotify)。有关详细信息,请参见下面链接的 NodeJS 文档。

返回的值是一个具有布尔字段 renamedchangedtimedout 的对象,给出监视文件的结果。

此函数的行为在不同平台之间略有不同。有关更详细的信息,请参见 https://nodejs.org/api/fs.html#fs_caveats

source
FileWatching.watch_folderFunction
watch_folder(path::AbstractString, timeout_s::Real=-1)

监视文件或目录 path 的更改,直到发生更改或经过 timeout_s 秒。此函数不轮询文件系统,而是使用特定于平台的功能从操作系统接收通知(例如,在 Linux 上通过 inotify)。有关详细信息,请参阅下面链接的 NodeJS 文档。

在调用同一 pathunwatch_folder 之前,将在后台继续跟踪 path 的更改。

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

此函数的行为在不同平台之间略有不同。有关更详细的信息,请参阅 https://nodejs.org/api/fs.html#fs_caveats

source
FileWatching.unwatch_folderFunction
unwatch_folder(path::AbstractString)

停止对 path 的后台更改跟踪。建议在另一个任务等待 watch_folder 在同一路径上返回时不要执行此操作,因为结果可能是不可预测的。

source

Pidfile

一个用于创建建议性 pid 文件(锁文件)的简单实用工具。

Primary Functions

FileWatching.Pidfile.mkpidlockFunction
mkpidlock([f::Function], at::String, [pid::Cint]; kwopts...)
mkpidlock(at::String, proc::Process; kwopts...)

为当前进程或由 pid 或 proc 标识的进程创建路径 "at" 的 pidfile 锁。可以传入一个函数,在锁定后执行,适用于 do 块,之后锁将自动关闭。如果锁定失败且 wait 为 false,则会抛出错误。

锁将通过 closefinalizer 或在 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,则在锁定失败时引发错误。
source
FileWatching.Pidfile.trymkpidlockFunction
trymkpidlock([f::Function], at::String, [pid::Cint]; kwopts...)
trymkpidlock(at::String, proc::Process; kwopts...)

mkpidlock 类似,但如果文件已经被锁定,则返回 false 而不是等待。

Julia 1.10

此函数至少需要 Julia 1.10。

source

Helper Functions

FileWatching.Pidfile.open_exclusiveFunction
open_exclusive(path::String; mode, poll_interval, wait, stale_age, refresh) :: File

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

有关关键字参数的描述,请参见 mkpidlock

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

尝试创建一个新的文件以进行读写建议独占访问,如果文件已存在则返回空。

source
FileWatching.Pidfile.parse_pidfileFunction
parse_pidfile(file::Union{IO, String}) => (pid, hostname, age)

尝试解析我们的 pidfile 格式,对于任何读取失败的元素,分别替换为 (0, "", 0.0)。

source
Base.Filesystem.touchMethod
Base.touch(::Pidfile.LockMonitor)

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

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

source