檔案事件

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.dev.org.tw/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.dev.org.tw/api/fs.html#fs_caveats

FileWatching.unwatch_folder函數
unwatch_folder(path::AbstractString)

停止背景追蹤 path 的變更。不建議在另一個工作在同一個路徑上等待 watch_folder 回傳時執行此動作,因為結果可能無法預測。

Pidfile

一個用於建立建議性 pid 檔案(鎖定檔案)的簡單實用工具。

主要函數

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

為目前程序或由 pid 或 proc 識別的程序建立路徑「at」的 pid 檔案鎖定。可以採用一個函數,在鎖定後執行,用於 do 區塊中,之後鎖定會自動關閉。如果鎖定失敗,且 wait 為 false,則會擲回錯誤。

鎖定會由 closefinalizer 或在 proc 結束後不久釋放。請確保返回值在程式碼關鍵區段的最後是存在的,因此 finalizer 不會過早回收它。

選用的關鍵字引數

  • mode:檔案存取模式(由程序 umask 修改)。預設為世界可讀。
  • poll_interval:指定嘗試之間的最大時間(如果 watch_file 不起作用)
  • stale_age:根據 mtime 刪除比此秒數舊的現有 pidfile(忽略鎖定)。如果檔案中的 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)

嘗試剖析我們的 pidfile 格式,對於任何讀取失敗的元素,分別以 (0, "", 0.0) 取代。

FileWatching.Pidfile.stale_pidfile函數
stale_pidfile(path::String, stale_age::Real, refresh::Real) :: Bool

open_exclusive 的輔助函數,用於判斷 pidfile 是否過期。

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

更新鎖定的 mtime,以表示它仍然是新的。

另請參閱 mkpidlock 建構函數中的 refresh 關鍵字。