檔案事件
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.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
。
傳回的值是一個配對,其中第一個欄位是變更檔案的名稱(如果可用),而第二個欄位是一個物件,其中包含布林欄位 renamed
、changed
和 timedout
,提供事件。
此函式的行為在不同平台上略有不同。有關更詳細的資訊,請參閱 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,則會擲回錯誤。
鎖定會由 close
、finalizer
或在 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。
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)
嘗試剖析我們的 pidfile 格式,對於任何讀取失敗的元素,分別以 (0, "", 0.0) 取代。
FileWatching.Pidfile.stale_pidfile
— 函數stale_pidfile(path::String, stale_age::Real, refresh::Real) :: Bool
open_exclusive
的輔助函數,用於判斷 pidfile 是否過期。
FileWatching.Pidfile.isvalidpid
— 函數isvalidpid(hostname::String, pid::Cuint) :: Bool
嘗試保守估計 pid 是否為有效的程序 ID。
Base.Filesystem.touch
— 方法